2017-02-25 232 views
-2

我會先說,我的問題標題自己說明,這一切意味着應該是兩個選擇(或嵌套的,或w/e);但是我陷入了真正的場景,我只能使用一個選擇。真。T-SQL基於WHERE子句的結果的條件WHERE子句

的問題是相當簡單,

允許採取以下簡單的表格(接合)

T1.A T2.B T2.C 
____________________ 
3  6  'hello' 
3 NULL 'default1' 
4 NULL 'default2' 
5  6  'jack!' 

基本上我想返回1行對於每個不同的含有甲&乙& C其中B具有兩個表中的匹配(我將在下面展開)
足夠簡單,但如果行(A)沒有匹配(B),那麼我希望該行仍然返回默認值(B = NULL )

因此,採取上表我想這樣

3  6  'hello'  
4 NULL 'default2' 
5  6  'jack!' 

我的選擇到目前爲止的樣子,但我難倒如何得到我想要的結果:

/****** Script for SelectTopNRows command from SSMS ******/ 
SELECT T1.A, T2.B, T2.C 
FROM [Table] T1 
JOIN [Table2] T2 ON T1.D = T2.D 
WHERE T1.B = T2.B OR T2.B IS NULL 

顯然,現在的問題是,所有的「默認」行返回,我只希望T2.B IS NULL如果沒有T1.B要返回= T2.B

編輯

要說明,D是表2的標識。
B是一個常見列,實際上是第三個不需要的表的身份(作爲與該問題無關的其他列的標識,所以我沒有發佈他們)

對於那些想要完整的代碼,我有足夠的技巧來篩選所需要的而不是;你不想要所有表格的完整50列定義或全部sp的6個臨時表格-_-

感謝大家的幫助; Tim在關於B的評論中提出了他的問題。解決方案:簡單地添加一個備用(額外)C列,然後合併它,將B子句放入JOIN語句並使其成爲LEFT JOIN,並然後重新加入它的表2,其中它的值,所以我有:

/****** Script for SelectTopNRows command from SSMS ******/ 
SELECT T1.A, T2.B, COALESCE(T2.C, T3.C) AS C 
FROM [Table] T1 
LEFT JOIN [Table2] T2 ON T1.D = T2.D AND T1.B = T2.B 
JOIN [Table2] T3 ON T1.D = T3.D AND T3.B IS NULL 

這給了我我想要的結果:

3  6  'hello'  
4 NULL 'default2' 
5  6  'jack!'  
+1

「我被困在一個場景中,真的,我只能使用一個選擇。」 - 什麼情況?爲什麼? –

+1

*我只是希望魔術?* - 他們停止提供這些服務:D – GurV

+0

基本上我懷疑我可以做我想要的一個單一的選擇,但如果我不能,我將不得不廢除整個事情,所以我伸出手去詢問是否有人看到一種方法來做到這一點,我現在沒有看到它......這是500行遺留代碼場景。決定用多個選擇來做並不是一個可行的選擇。 – Spacemonkey

回答

0

我猜是這樣的你是什麼

SELECT 1.A, 
      COALESCE(2.B, 3.B) AS B, 
      CASE 
      WHEN 2.B IS NULL THEN 3.C 
      ELSE 2.C 
      END AS C 
FROM  [Table] 1 
LEFT JOIN [Table2] 2 
ON  1.D = 2.D AND 1.B = 2.B 
LEFT JOIN [Table2] 3 
ON  1.D = 3.D AND 2.B IS NULL 
+0

COALESCE !!!這將它帶到我所需要的!!!,謝謝你們都指着我正確的方向,並帶來了! - 所以我們沒有完全一樣的選擇語句作爲解決方案,但這是要走的路 – Spacemonkey

0

在SQL Server中,你可以使用outer apply此:

SELECT t1.A, t2.B, t2.C 
FROM [Table] t1 OUTER APPLY 
    (SELECT TOP 1 t2.* 
     FROM t2 
     WHERE t1.D = t2.D AND 
      (t1.B = t2.B OR t2.B IS NULL) 
     ORDER BY (CASE WHEN t1.B = t2.B THEN 1 ELSE 2 END) 
    ) t2; 

結果集有第一個表的每一行一行。第二個表中的列首先來自匹配行,然後是來自具有NULL值的行(可能是包含默認值的行)。

+0

我在那裏計數兩個'SELECT' - 我不知道這是他們聲稱他們不能使用的,因爲他們也是提到「嵌套」或者他們是否在談論兩個完全不同的SELECT語句。 –