繁体   English   中英

如何在JOIN子句中为所有表测试相同的列值?

[英]How to test the same column value for all tables in a JOIN clause?

我有以下示例查询;

SELECT S.Column1, S.Column2
FROM TableS as S
LEFT JOIN TableP as P ON S.PID = P.ID
LEFT JOIN TableI as I ON P.IID = I.ID
WHERE I.Identifier = 'StringIdentifier'
      AND I.Relevant = 1
      AND P.Relevant = 1
      AND S.Relevant = 1 

有什么方法可以将最后三行简化为仅一行,一次检查所有表中的“ Relevant列?

显然仅用AND Relevant = 1替换最后3行将不起作用,因为它会产生错误:

列名称不明确“相关”。

编辑: Relevant列的数据类型是位。

如果您在该列上有索引,那么这就是方法。

如果您不这样做,只是希望它看起来不错或不错,则可以执行以下操作:

AND I.Relevant * P.Relevant * S.Relevant = 1 -- assuming they are numeric
AND I.Relevant & P.Relevant & S.Relevant = 1 -- assuming bit

如果不是数字或位(文本),那么您需要转换为数字,并且看起来也不会那么好。

另外,我建议丢失左(从连接中),因为在许多情况下这样做会更快,并且在此代码上这没有意义。

您的WHERE条件正在将JOIN变成内部联接,因此您应该正确表达联接:

SELECT S.Column1, S.Column2
FROM TableS S JOIN
     TableP P
     ON S.PID = P.ID JOIN
     TableI I
     ON P.IID = I.ID AND I.Identifier = 'StringIdentifier'
WHERE I.Relevant = 1 AND
      P.Relevant = 1 AND
      S.Relevant = 1;

假设“ Relevant ”仅采用0/1的值,则可以使用横向联接:

SELECT S.Column1, S.Column2
FROM TableS S JOIN
     TableP P
     ON S.PID = P.ID JOIN
     TableI I
     ON P.IID = I.ID AND
        I.Identifier = 'StringIdentifier' CROSS APPLY
     (SELECT MIN(v.Relevant) as min_relevant
      FROM (VALUES (I.Relevant), (P.Relevant), (S.Relevant)
           ) v(Relevant)
     ) v
WHERE v.min_relevant = 1;

这对于3个比较并没有真正的帮助。 但是,如果您有一打,它将很有用。

如果您的问题是必须重复1而不是表达式的长度,则可以使用ALL

SELECT S.Column1, S.Column2
FROM TableS as S
LEFT JOIN TableP as P ON S.PID = P.ID
LEFT JOIN TableI as I ON P.IID = I.ID
WHERE I.Identifier = 'StringIdentifier'
      AND 1 = ALL(SELECT I.Relevant
                  UNION
                  SELECT P.Relevant
                  UNION
                  SELECT S.Relevant)

该查询是错误的,因为有两个左连接,但是在我建议的那些表上有条件的地方:

SELECT S.Column1, S.Column2
FROM TableS as S
    LEFT JOIN TableP as P ON S.PID = P.ID AND P.Relevant = 1
    LEFT JOIN TableI as I ON P.IID = I.ID AND I.Identifier = 'StringIdentifier' AND I.Relevant = 1
WHERE S.Relevant = 1 

正确的查询比简化的查询更好

假设相关是个笨蛋,您可以做

... and I.Relevant and P.Relevant and S.Relevant

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM