2015-02-09 51 views
0

我在SQL Server 2008中工作。我有一个查询,我在两个表之间做一个LEFT JOIN查看表A中的哪些行不在表B中。基本查询是:SQL Server:连接条件ON语句的两个表

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

如果行返回第一个,但是第二个存在,你想从第二个查询得到数据吗? – HLGEM 2015-02-09 22:08:29

+0

是的。基本上,我试图看看A.some_key是否在表B中。如果在some_key上找不到它,那么我需要查看它是否在'0'+ some_key上找到。 – user3100444 2015-02-09 22:09:59

+0

因此,如果你能够在结果中找到两者,联盟声明是最简单的方法。 – HLGEM 2015-02-09 22:12:13

回答

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) 
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 

希望帮助

+0

我无法使用UNION或OR。我想我需要更加清楚。问题是,如果第二个查询需要执行(只有在第一个查询返回任何内容时才执行),我不想查看第一个查询的结果集。这是为了数据验证。 – user3100444 2015-02-09 22:16:35

+0

问题是左连接。这将导致第一个查询总是返回A中的任何行。如果将LEFT JOIN更改为INNER JOIN,则我的答案中的第3个查询应该可以工作 – Spock 2015-02-09 22:19:15

+0

我无法将LEFT JOIN更改为INNER 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一片空白。 – user3100444 2015-02-09 22:46:24

0

没有进入的代码细节,如果有选择,你可以执行第二个查询一些实际的行我会包裹第一选择为插入到一个临时表中,然后使用@@ ROWCOUNT,看看哪些因此会忽略插入到临时表中,并且您的查询将只返回一个数据集。