首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >负选择SQL查询

负选择SQL查询
EN

Stack Overflow用户
提问于 2010-06-24 07:39:37
回答 3查看 21.7K关注 0票数 10

我的任务是从我们的sql数据库返回一个否定选择。我将尽我所能定义标准。到目前为止,我还没有设计出一个可以工作的查询。

业务表

总线名称

活动表

活动ID

活动扩展表

Ext ID总线ID

我需要在关联表中没有该企业id #的记录的所有企业的企业名称。简单地说,所有的企业都没有活动。业务ID可以出现在一个或两个关联表中。

在尝试使用joins和not exists或not exists语句创建查询时,这给我带来了几个小时的麻烦。没有成功。

有什么想法吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-06-24 08:37:54

使用NOT IN

代码语言:javascript
复制
SELECT b.*
  FROM BUSINESS b
 WHERE b.business_id NOT IN (SELECT a.business_id
                               FROM ACTIVITY a)
   AND b.business_id NOT IN (SELECT ae.business_id
                               FROM ACTIVITY_EXTENSION ae)

使用NOT EXISTS

代码语言:javascript
复制
SELECT b.*
  FROM BUSINESS b
 WHERE NOT EXISTS (SELECT NULL 
                     FROM ACTIVITY a
                    WHERE a.business_id = b.business_id)
   AND NOT EXISTS (SELECT NULL 
                     FROM ACTIVITY_EXTENSION ae
                    WHERE ae.business_id = b.business_id)

使用LEFT JOIN/IS NULL

代码语言:javascript
复制
   SELECT b.*
     FROM BUSINESS b
LEFT JOIN ACTIVITY a ON a.business_id = b.business_id
LEFT JOIN ACTIVITY_EXTENSION ae ON ae.business_id = b.business_id
    WHERE a.business_id IS NULL
      AND ae.business_id IS NULL

结论

因为关系是外键(business_id),所以可以安全地假设它们都不是null。在这种情况下,NOT INNOT EXISTS是在SQL Server中查找缺失值的最佳方法。LEFT JOIN/IS NULL效率较低- you can read more about it in this article

票数 25
EN

Stack Overflow用户

发布于 2010-06-24 07:43:17

SELECT * FROM businesses WHERE business.id NOT IN (SELECT DISTINCT business_id FROM activities)

票数 5
EN

Stack Overflow用户

发布于 2010-06-24 07:49:21

我将使用左连接和联合的组合,如下所示:

代码语言:javascript
复制
select * from Business b left join (select id, bid from Activity union select id, bid from ActivityExtension) a on b.id=a.bid where a.bid=null 
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3106336

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档