SQL join:当值不在一组值中时如何选择
Posted
技术标签:
【中文标题】SQL join:当值不在一组值中时如何选择【英文标题】:SQL join: how to select when value not in a set of values 【发布时间】:2010-12-31 19:10:23 【问题描述】:我有两张桌子,table1 和 table2。表 1 与表 2 是一对多的关系(表 1 中的一行映射到表 2 中的多行)。 table2 中有一个字段叫做代码。如果表 2 中的代码值都不等于某组值(例如 1、2 和 3),我想选择表 1 中的值。我不确定如何编写这种连接。 假设 table1 中的主键称为 id,映射到的外键称为 did。你能告诉我这种join怎么写吗?
【问题讨论】:
您能否提供表格结构的细分?NOT EXISTS
、LEFT JOIN
、NOT IN
或 EXCEPT
您使用的是什么 RDBMS?
【参考方案1】:
这被称为antijoin。
最简单的实现是:
SELECT * FROM table1
WHERE NOT EXISTS (SELECT 1 FROM table2
WHERE table2.did = table1.id
AND table2.code in (1,2,3))
或者,使用外连接(我不是 100% 确定这会起作用,因为我自己总是使用 NOT EXIST 语法来进行反连接):
SELECT table1.*
FROM table1
LEFT OUTER JOIN
table2
ON table1.id = table2.did
AND table2.code in (1,2,3)
WHERE table2.did is NULL
【讨论】:
检查你的数据库但不存在往往比左连接更快。 @HLGEM - 有一个很好的页面解释了各种反连接对 mysql 的性能影响:explainextended.com/2009/09/18/… 对于 SQL server sqlinthewild.co.za/index.php/2010/03/23/…【参考方案2】:SELECT * FROM table1 t1
LEFT JOIN table2 t2 ON t1.id = t2.did
【讨论】:
可能,这个要求本身就不是很清楚,所以我保持简单。【参考方案3】:您的问题可以问得更清楚。需要注意您的自然语言以及您的 SQL。我可能没有理解你的问题。请注意“如果 table2 中的代码值都不等于某些值(例如 1、2 和 3),我想选择 table1 中的 value”是什么意思。您的意思是“表 1 中的 行”吗?而不是“等于某个集合”,您的意思是“在某个集合中找到”?
如果您有两个表处于一对多关系中,例如作曲家及作品:
COMPOSERS
composerid
composername
DOB
WORKS
workid
workname
composerid
datecomposed
worktype (e.g. sonata, string quartet, quintet, symphony)
如果你想找到所有不是奏鸣曲或五重奏的作曲家作品,你可以这样做:
select composer.composername, works.workname, worktype
from COMPOSERS inner join WORKS
on COMPOSERS.composerid = WORKS.composerid
WHERE worktype not IN ('sonata','quintet')
如果工作类型允许空值,如果您希望在没有工作类型输入记录的情况下工作,则必须在 where 子句中添加“或工作类型为空”。
【讨论】:
OP 想要找到所有从未写过奏鸣曲或五重奏的作曲家以上是关于SQL join:当值不在一组值中时如何选择的主要内容,如果未能解决你的问题,请参考以下文章
SQL 查询 (Pro*C) 如何能够找到 db 表中不存在的一组值