我的任务是从我们的sql数据库返回一个否定选择。我将尽我所能定义标准。到目前为止,我还没有设计出一个可以工作的查询。
业务表
总线名称
活动表
活动ID
活动扩展表
Ext ID总线ID
我需要在关联表中没有该企业id #的记录的所有企业的企业名称。简单地说,所有的企业都没有活动。业务ID可以出现在一个或两个关联表中。
在尝试使用joins和not exists或not exists语句创建查询时,这给我带来了几个小时的麻烦。没有成功。
有什么想法吗?
发布于 2010-06-24 08:37:54
使用NOT IN
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
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
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 IN和NOT EXISTS是在SQL Server中查找缺失值的最佳方法。LEFT JOIN/IS NULL效率较低- you can read more about it in this article。
发布于 2010-06-24 07:43:17
SELECT * FROM businesses WHERE business.id NOT IN (SELECT DISTINCT business_id FROM activities)
发布于 2010-06-24 07:49:21
我将使用左连接和联合的组合,如下所示:
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 https://stackoverflow.com/questions/3106336
复制相似问题