2015-02-09 49 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,看看哪些因此會忽略插入到臨時表中,並且您的查詢將只返回一個數據集。