SQL Server:使用条件ON语句连接2个表

时间:2015-02-09 22:06:04

标签: sql-server

我在SQL Server 2008中工作。我有一个查询,其中我在两个表之间进行LEFT JOIN,以查看表A中哪些行不在表B中。基本查询是:

SELECT
A.a_col,
B.b_col
FROM A
LEFT JOIN B
ON A.some_key = B.another_key
WHERE
B.another_key IS NULL

当任何行从给定查询返回时,我需要再次运行相同的查询。但是,如果第二个查询运行,我不希望输出上述查询中的任何行。在第二个例子中,我需要将A.some_key转换为如下:

SELECT
A.a_col,
B.b_col
FROM A
LEFT JOIN B
ON '0' + A.some_key = B.another_key
WHERE
B.another_key IS NULL

我需要一个SQL批处理(语句组)中的两个步骤。换句话说,如果任何行从第一个查询返回,则执行第二个查询,最终结果集仅来自第二个查询,而不是第一个查询。我如何实现这一目标?

3 个答案:

答案 0 :(得分:0)

我不确定我是否正确理解了问题,但您可以使用

UNION

SELECT A.a_col, B.b_col
FROM A
LEFT JOIN B ON A.some_key = B.another_key
UNION
SELECT A.a_col, B.b_col
FROM A
LEFT JOIN B ON '0' + A.some_key = B.another_key

OR

SELECT A.a_col, B.b_col
FROM A
LEFT JOIN B ON 
    (A.some_key = B.another_key) 
OR  ('0' + A.some_key = B.another_key)

如果你只需要执行第二个查询,如果第一个查询没有返回任何结果,你可以尝试这个......

SELECT A.a_col, B.b_col
FROM A
    JOIN B ON A.some_key = B.another_key
UNION
SELECT A.a_col, B.b_col
FROM A
LEFT JOIN B ON '0' + A.some_key = B.another_key
WHERE (SELECT COUNT(1)
FROM A
    JOIN B ON A.some_key = B.another_key) = 0

希望有所帮助

答案 1 :(得分:0)

如果OP的第一个查询返回任何行,则以下查询将返回OP的第二个查询中的所有行。否则,不返回任何行。

SELECT A.a_col, B.b_col
FROM A
LEFT JOIN B ON '0' + A.some_key = B.another_key
WHERE B.another_key IS NULL AND 
      EXISTS (SELECT 1
              FROM A
              LEFT JOIN B ON A.some_key = B.another_key
              WHERE B.another_key IS NULL)

答案 2 :(得分:0)

不考虑代码的细节,我将第一个select作为INSERT包装到临时表中,然后使用@@ rowcount查看是否有一些实际的行被选中,你可以执行第二个查询,因此会忽略插入临时表,您的查询将只返回一个数据集。