【问题标题】:How to return a row where joins ALL exist SQL如何返回所有连接都存在的行 SQL
【发布时间】:2016-05-19 17:35:40
【问题描述】:

当连接表在我的on 上有所有匹配的行时,我如何返回一行(最好是在 ANSI SQL 中)?

错误行为示例:

SELECT table1.*
    , whatever
FROM   table1
      INNER JOIN table2 ON table2.whateverrelation = table1.whateverrelation
                       AND table2.matching IN(1, 2);

将返回每个 table1 行与 table2 上的匹配关系,即 1 OR 2(即,将返回具有一个或多个 matching 字段的 table1 行。

我怎样才能得到只返回 table2 行相关的 table1 行并且其 matching 是 1 和 2 的东西(所以是 AND 而不是 OR,所以必须至少有一个table2 行与matching = 1 和至少一个与matching = 2,所以它不会显示任何table1 行没有两个匹配)?

我不希望对同一张表进行两次连接,我知道我可以进行两次左连接,一次匹配 1,一次匹配 2,但我事先不知道有多少次匹配会需要的。

干杯

【问题讨论】:

    标签: mysql sql postgresql ansi-sql


    【解决方案1】:

    你可以使用:

    SELECT table1.col1, ....
    FROM table1 
    INNER JOIN table2 
      ON table2.whateverrelation = table1.whateverrelation 
    GROUP BY  table1.col1, ....
    HAVING SUM(table2.matching = 1) > 0
       AND SUM(table2.matching = 2) > 0;
    

    【讨论】:

    • 我将其修改为:HAVING SUM((table2.matching = 1)::int) > 0,因为 postgres 在对布尔值求和时遇到问题。它仍然令人费解,但可能是我能得到的最好的。如果有办法将这两者结合起来,那就完美了。
    • @DanDart 是的,SUM(... > 0) 将适用于 MySQL(问题标签)。如果您使用的是 PostgreSQL,请按照您的建议使用 CASE
    • 是的,我正试图让它与 SQL 无关。
    • 不管怎样,对我有用。必须弄清楚如何使 bool = int 数据库不可知,但这是一个不同的问题。标记为已接受。干杯
    猜你喜欢
    • 2015-07-26
    • 2021-12-25
    • 2019-03-08
    • 2015-01-20
    • 1970-01-01
    • 2021-07-14
    • 2019-04-29
    • 2011-08-03
    • 2021-04-12
    相关资源
    最近更新 更多