SQL Server中的条件连接语句

时间:2015-09-14 16:20:53

标签: sql sql-server join case

我希望以第一个条件通过的方式实现条件连接语句,然后根据第一个条件选择记录,否则转到第二个连接条件。

Select 
    col1, Col2, Col3, TableB.Column1, TableB.Column2 
from 
    TableA
JOIN 
    TableB ON (TableA.col1 = TableB.Column1
               TableA.col2 = TableB.Column2
               TableA.col3 = TableB.Column3)
              OR //second OR
              (
               TableA.col1 = TableB.Column1
               TableA.col2 = TableB.Column2
               TableB.Column3 IS NULL
              )
             OR //Third OR
              (
               TableA.col1 = TableB.Column1
               TableA.col3 = TableB.Column3
               TableB.Column2 IS NULL
              )

如果条件一通过,查询不应该进入第二个OR条件,我应该只输出一行作为输出。

2 个答案:

答案 0 :(得分:0)

如果我已正确理解您的要求,那么您正在寻找以下查询:

SELECT col1, Col2, Col3
FROM (
  SELECT col1, Col2, Col3,
         RANK() OVER (ORDER BY seqNo) AS rn 
  FROM (
    -- Query no. 1
    SELECT col1, Col2, Col3, 1 AS seqNo 
    FROM TableA
    INNER JOIN TableB ON TableA.col1 = TableB.Column1 
                        AND TableA.col2 = TableB.Column2
                        AND TableA.col3 = TableB.Column3

    UNION ALL

    -- Query no. 2
    SELECT col1, Col2, Col3, 2 AS seqNo
    FROM TableA
    INNER JOIN TableB ON TableA.col1 = TableB.Column1 
                        AND TableA.col2 = TableB.Column2
                        AND TableB.Column3 IS NULL

    UNION ALL

    -- Query no. 3
    SELECT col1, Col2, Col3, 3 AS seqNo 
    FROM TableA
    INNER JOIN TableB ON TableA.col1 = TableB.Column1 
                        AND TableB.Column2 IS NULL
                        AND TableA.col3 = TableB.Column3 ) AS t 
) AS s
WHERE s.rn = 1

以上内容将返回三个独立查询的第一个非空集UNION

这意味着如果查询号码。 1返回一个非空集,然后返回此集的行,只返回这些。否则查询行数没有。 2返回,等等。

答案 1 :(得分:0)

如果我已正确理解要求,以下内容应返回所需的结果:

SELECT col1, Col2, Col3, column1, column2
FROM (
  SELECT col1, Col2, Col3, column1, column2,
         RANK() OVER (PARTITION BY col1, Col2, Col3 ORDER BY seqNo) AS rn 
  FROM (
    -- Query no. 1
    SELECT col1, Col2, Col3, column1, column2, 1 AS seqNo 
    FROM TableA
    INNER JOIN TableB ON TableA.col1 = TableB.Column1 
                        AND TableA.col2 = TableB.Column2
                        AND TableA.col3 = TableB.Column3
    UNION ALL
    -- Query no. 2
    SELECT col1, Col2, Col3, column1, column2, 2 AS seqNo
    FROM TableA
    INNER JOIN TableB ON TableA.col1 = TableB.Column1 
                        AND TableA.col2 = TableB.Column2
                        AND TableB.Column3 IS NULL
    UNION ALL
    -- Query no. 3
    SELECT col1, Col2, Col3, column1, column2, 3 AS seqNo 
    FROM TableA
    INNER JOIN TableB ON TableA.col1 = TableB.Column1 
                        AND TableB.Column2 IS NULL
                        AND TableA.col3 = TableB.Column3 ) AS t 
) AS s
WHERE s.rn = 1

SQLFiddle here