我在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批处理(语句组)中的两个步骤。换句话说,如果任何行从第一个查询返回,则执行第二个查询,最终结果集仅来自第二个查询,而不是第一个查询。我如何实现这一目标?
答案 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查看是否有一些实际的行被选中,你可以执行第二个查询,因此会忽略插入临时表,您的查询将只返回一个数据集。