我有两张表,一张工商注册信息登记表gsdj,一张税务登记表swdj,两表中都有“企业名称”qymc这一字段,如何找出工商登记了而未进行税务登记的企业。
我的语句是:
select * from gsdj where gsdj.qymc not in (select swdj.qymc from swdj ) 或者
select * from gsdj where not exists (select * from swdj where sw.qymc=gs.qymc )
但是返回的结果却是工商注册登记表中的所有数据,我通过单条查询又能找出一些既进行了工商登记又进行了税务登记。 不知道错在哪儿,求大神指点!
首先,在SQL中(以SQL Server为例),查询存在一个表而不在另一个表中的数据记录的方法有很多,介绍其中4种:
1、方法一(仅适用单个字段):使用 not in ,比较容易理解,缺点是效率低
如:select A.ID from A where A.ID not in (select ID from B);
2、方法二(适用多个字段匹配):使用 left join...on... , "B.ID isnull" 表示左连接之后在B.ID 字段为 null的记录。
如:select A.ID from A left join B on A.ID=B.ID where B.ID is null ;
3、方法三(适用多个字段匹配)
如:select * from B where (select count(1) as num from A where A.ID = B.ID) = 0;
4、方法四(适用多个字段匹配)
如:select * from A where not exists(select 1 from B where A.ID=B.ID)
接着,我们来分析你的SQL语句为什么返回数据不准确的原因。
从你的SQL基础语句来看,你使用了方法一和方法四这两种,两种语法本身都是正确的,但是却没有达到预期的效果,初步分析,问题可能出在gsdj和swdj这两张表的qymc字段的判断比较上。
举个例子:'企业名称'和'企业名称 '这两个字符串看似相同,实际却并不相同,因为第二个“企业名称 ”的后面跟了一个空格字符。就因为这个空格字符导致这个"'企业名称'='企业名称 '"等式不成立。
考虑到你qymc这个字段的类型是字符型,建议你在原有sql基础上做一个微调如下:
select * from gsdj gs where not exists (select * from swdj sw where rtrim(ltrim(sw.qymc )) )=rtrim(ltrim(gs.qymc )));
其中Ltrim()可以去除左侧空格,rtrim()可以去除右侧的空格,也就是说我们是对去除空格后的企业名称进行比较,排除了空格的干扰。
扩展资料:
在SQL中,对于字符型文本数据,经常需要用到去空格的操作,对ORACLE数据来说可以通过TRIM()函数来简单实现,而SQL SERVER中并没有TRIM()函数,只有LTRIM()和RTRIM()两个函数。
SQL 中使用ltrim()去除左边空格 ,rtrim()去除右边空格 ,没有同时去除左右空格的函数,要去除所有空格可以用replace(字符串,' ',''),将字符串里的空格替换为空。
例:去除空格函数
declare @temp char(50)
set @temp = ' hello sql '
print ltrim(@temp) --去除左边空格
print rtrim(@temp) --去除右边空格
print replace(@temp,' ','') --去除字符串里所有空格
print @temp
>> 输出结果
hello sql
hello sql
hellosql
hello sql
你这个应该不对,两个条件矛盾了。
追答那就是其他的共同条件
你这个跟我那条执行效果是一样的。
追答这个肯定SQL没错的,我自己试了下刚才,匹配不出来可能是你2个表的qymc这个字段有问题,可能一个表比另一个表多了些其他字符
追问兄弟加Q聊一下可以不。
追答发你私信了 加我下
本回答被网友采纳SQL中,如何查询存在一个表而不在另一个表中的数据记录
1、方法一(仅适用单个字段):使用 not in ,比较容易理解,缺点是效率低 如:select A.ID from A where A.ID not in (select ID from B);2、方法二(适用多个字段匹配):使用 left join...on... , "B.ID isnull" 表示左连接之后在B.ID 字段为 null的记录。如:select A.ID from A...
sql语句 判断表数据是否存在另一个表中
只需判断一下即可,根据你的题目意思应该是a表的id和b表的id相关联。select *, case when (select count(*) from b where id = a.id)>0 then 1 else 0 end as flag f...
sql 如何查询不在这个范围内的数据,如下
用not in语句即可解决。【SQL查询存在一个表而不在另一个表中的数据的具体方法】例如:A、B两表,找出ID字段中,存在A表,但是不存在B表的数据。A表总共13w数据,去重后大约3W条数据,B表有2W条数据,且B表的ID字段有索引。方法一 使用 not in ,容易理解,效率低 ~执行时间为:1.395秒~方法...
mysql 查询一个表中没有存在在另一个表的数据
SELECT * FROM A WHERE id NOT IN ( SELECT id FROM B);或者SELECT * FROM A WHERE NOT EXISTS ( SELECT 1 FROM B WHERE B.id = A.id );或者SELECT A.* FROM A LEFT JOIN B ON (A.id = B.id)WHERE b.id IS NULL ...
SQL中如何查询A表中的数据有部分存在B表中并显示出来
SQL中查询A表中的数据有部分存在B表中并显示出来,可以参考下面几种方法:1、select * from B表 where item_no in (select 条码 from A表)2、select * from A表,B表 where A表.条码=B表.item_no
SQL查询:我想查找某一表里是否有超过两次的记录如何查找
查询有2个以上X:select * from 表 where X in (select X from 表 group by X having count(X) > 1 )查询X,Y,Z有2个以上:select * from 表 where X in ( select X from 表 group by X having count(X) > 1)union select * from 表 where Y in ( select Y from 表 group ...
...一张表A中查询到另外一张表B中没有的记录,SQL语句怎么写?
select * from B where 字段 in (select 字段 from A)查询A中是否在B中存在 字段改成你要查的字段 提取的时候用 select distinct 字段 from A where 字段 not in (select 字段 from B) 插入时候用
SQL查询消除在另一个表里存在的记录,如何写呀?
假设select T1.AId,T2.BId from T1 inner join T2 on T1.AId = T2.BId可以得到你想要的结果:那么:select aa.from (select T1.AId t1aid,T2.BId t2bid from T1 inner join T2 on T1.AId = T2.BId) aa where not exists (select 1 from t3 where t3.aid = aa.t1aid and t3...
sql中怎么两个表,怎么把一个表查出来的数据,追加显示到另一个表的右边...
sql中怎么两个表,怎么把一个表查出来的数据,追加显示到另一个表的右边。两个表的数据量一样 连接后查询没有对应的数据很简单,假设你有一张产品表,还有一张销售表,而你想关联后找到哪些产品没有销售,代码如下:select * from 产品表 aleft join 销售表 b on a.产品ID=b.产品IDwhere b....
...的结果是否存在,存在就输出结果,不存在就执行另一段select b表_百度...
if exists(select * from a)select * from aelse select * from b