【问题标题】:SQL join: how to select when value not in a set of valuesSQL join:当值不在一组值中时如何选择
【发布时间】: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?

标签: sql join


【解决方案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

【讨论】:

【解决方案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 想要找到所有从未写过奏鸣曲或五重奏的作曲家
猜你喜欢
  • 2016-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-04
  • 2015-10-19
  • 2016-05-15
  • 1970-01-01
  • 2012-07-15
相关资源
最近更新 更多