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 EXISTSLEFT JOINNOT INEXCEPT 您使用的是什么 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 表中不存在的一组值

如何从给定的一组值中进行选择,四舍五入?

仅在选中时读取 GTK 单选按钮信号

如何对位于开始日期和结束日期之间的一组值求和?

当值与 SQL Server 中的最后一条记录之间存在特定差距时如何选择值

如何从 belongsTo 关系中预先加载一组值