【问题标题】:SQL Select where all joined values equal valueSQL选择所有连接值都相等的地方
【发布时间】:2015-07-15 11:38:50
【问题描述】:

我正在尝试将此页面用作参考,但我的情况无法正常工作 SQL: Select records where ALL joined records satisfy some condition

我有两张表 - 一张是任务列表,另一张是任务步骤 我想加入taskID 上的表格并找到taskID 的所有步骤都标记为完成但整体任务尚未标记为完成的位置。

           table1                                   table2
taskID | taskName | taskComplete |             taskID | stepID | stepComplete
   1      task1          0                        1       21          1
   2      task2          0                        1       12          1
                                                  1       34          1
                                                  1       11          1
                                                  2        8          0
                                                  2        6          0
                                                  2        4          1

【问题讨论】:

    标签: sql sql-server select join


    【解决方案1】:

    SQL 问题最好通过集合思考来解决。

    您希望选择表 1 中的元素集,其中 table1.taskComplete 为 true,并且 table2 中的所有步骤都已完成。

    这可以重写为您要查找 table1 中 taskComplete = 0 的条目,而 table2 中没有 stepComplete = 0 的条目。

    SELECT table1.*
    FROM table1
    WHERE table1.taskComplete = 0 AND table1.taskID not in (SELECT taskID FROM table2 WHERE stepComplete = 0)
    

    【讨论】:

    • “所有步骤都标记为完成,但整体任务尚未标记完成。”
    • 谢谢@Jean-FrançoisSavard 我脑子里有那个部分忘了把它添加到where子句中。
    • 请注意,OP 指定他只想检索taskID
    【解决方案2】:

    您可以将问题改写为“我想查找尚未标记为完成但所有步骤都标记为完成的任务”,或者换句话说:“我想查找尚未标记为完成但不标记的任务”没有任何步骤被标记为“未完成”。

    当这样表述时,很明显not exists 运算符可以完成这项工作,而现在只需将英语翻译成 SQL:

    SELECT *
    FROM   table1
    WHERE  taskComplete = 0 AND
           NOT EXISTS (SELECT *
                       FROM   table2
                       WHERE  table2.taskID = table1.taskID AND stepComplete = 0) 
    

    【讨论】:

    • 请注意,OP 指定他只想检索taskID
    【解决方案3】:

    我相信这应该可以解决问题:

    SELECT taskID
     FROM table1 t1
     WHERE NOT EXISTS (SELECT 1 
                        FROM table2 
                        WHERE taskID = t1.id
                          AND stepComplete = 0)
      AND t1.taskComplete = 0;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-30
      • 2013-09-02
      • 2012-08-31
      • 1970-01-01
      • 2012-02-28
      • 1970-01-01
      • 1970-01-01
      • 2022-10-13
      相关资源
      最近更新 更多