SQL中,如何查询存在一个表而不在另一个表中的数据记录 20

我有两张表,一张工商注册信息登记表gsdj,一张税务登记表swdj,两表中都有“企业名称”qymc这一字段,如何找出工商登记了而未进行税务登记的企业。我的语句是:sele... 我有两张表,一张工商注册信息登记表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 )
但是返回的结果却是工商注册登记表中的所有数据,我通过单条查询又能找出一些既进行了工商登记又进行了税务登记。 不知道错在哪儿,求大神指点!
展开
 我来答
supboy306
推荐于2019-08-08 · TA获得超过2.6万个赞
知道答主
回答量:243
采纳率:100%
帮助的人:13.3万
展开全部

首先,在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

飞舞城
2015-05-20 · 一直进步就好,慢就是快,一件件处理好
飞舞城
采纳数:61 获赞数:78

向TA提问 私信TA
展开全部
select * from gsdj where gsdj.qymc =swdj.qymc and gsdj.qymc not in (select swdj.qymc from swdj )这两个表之间必须要有一个相连接的列
追问
你这个应该不对,两个条件矛盾了。
追答
那就是其他的共同条件
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
lhjnjnu
2015-05-20 · TA获得超过127个赞
知道答主
回答量:266
采纳率:0%
帮助的人:69.7万
展开全部
select * from gsdj gsdj where gsdj.qymc not in (select swdj.qymc from swdj swdj) 或者
select * from gsdj gs where not exists (select * from swdj sw where sw.qymc=gs.qymc )
试试加上表别名
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
tongyinqiu
推荐于2017-04-22 · TA获得超过206个赞
知道小有建树答主
回答量:246
采纳率:81%
帮助的人:177万
展开全部
select * from gsdj t1 where not exists (select * from swdj where qymc=t1.qymc )
更多追问追答
追问
你这个跟我那条执行效果是一样的。
追答
这个肯定SQL没错的,我自己试了下刚才,匹配不出来可能是你2个表的qymc这个字段有问题,可能一个表比另一个表多了些其他字符
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
锁映僪鹤骞
2019-10-03 · TA获得超过4017个赞
知道大有可为答主
回答量:3100
采纳率:33%
帮助的人:426万
展开全部
只需判断一下即可,根据你的题目意思应该是a表的id和b表的id相关联。
select *, case when (select count(*) from b where id = a.id)>0 then 1 else 0 end as flag from a如果你是想a表和b表的字段和id这两列都一样,才将flag显示为1的话,用下面的查询:
select *, case when (select count(*) from b where id = a.id and 字段 = a.字段)>0 then 1 else 0 end as flag from a
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(7)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式