首页 文章

SQL连接:如何选择何时值不在一组值中

提问于
浏览
4

我有两个表,table1和table2 . Table1与table2存在一对多的关系(table1中的一行映射到table2中的许多行) . table2中有一个名为code的字段 . 如果table2中的代码值都不等于某些值集(例如1,2和3),我想在table1中选择值 . 我不知道如何写这种联接 .
假设table1中的主键被称为id,并且它所映射的外键被称为 . 你能告诉我怎么写这种联接吗?

3 回答

  • 0

    这被称为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
    
  • 0
    SELECT * FROM table1 t1
    LEFT JOIN table2 t2 ON t1.id = t2.did
    
  • 7

    您可以更清楚地询问您的问题 . 需要注意您的自然语言以及SQL . 我可能没有理解你的问题 . 请注意“你的意思是什么”如果table2中的代码值都不等于某些值集(比如说1,2和3),我想选择table1中的值._". Do you mean "表1中的行"? And instead of "等于某些集合" do you mean "在某些集合中找到“?

    如果您有一对多关系中的两个表,例如作曲家和作品:

    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')
    

    IF工作类型允许空值,如果您希望在没有输入工作类型的情况下工作,则必须在where子句中添加“或worktype为null” .

相关问题