2016-04-28 29 views
0

我正在編寫查詢的3個版本,每個版本的條件略有不同。不過,我想加入他們就像在提供的連接圖。我不想在任何報告上有任何重複,所以我特別希望A具有A的所有獨特結果,並且包含A的交叉B & C.然後,我想讓B包含B和交叉的所有唯一結果B & C.最後C只有C才具有唯一的結果。Triple在每個中加入獨特的結果?

enter image description here

查詢本身運行正常和結構如下:

enter image description here

思想我將向芒它的情況下,我已經得到了結構中的所有錯誤的或潛在的可能有寫一個更好的方法?

任何幫助破解這一個將不勝感激。

+0

我不知道你想這個什麼和給出的答案是是正確的,但只需執行一次查詢並在select語句中包含三個case語句以確定每個記錄的三個類別中有多少屬於哪一個,可能會更輕鬆。它會爲您節省三次顯示相同的記錄。 – MightyRearranger

+1

我不明白。 a,b和c是集合。什麼意思選擇a。*,b。*,c。*。你真的想要一個完整的外部連接在他們之間和哪個領域。或者你想要的東西類似於(a U b U c),你可以通過select * from union select * from b union select * from c – Mottor

+0

謝謝大家回答你的問題,因爲在WHERE條件中的OR我越來越多的交叉,例如條件3將出現在所有3個查詢中。我試圖達到的目標是擁有3套,這樣我就擁有了一個優先系統,A然後是B然後是C,但是爲了不重複工作而刪除重複部分。所以說,例如,我從查詢中得到300個結果,沒有額外的OR條件,我想在A中看到100,在B中爲100,在C中爲100。目前,當我知道200重複由於交叉條件。嘗試在沒有喜悅的情況下應用答案。 – afropunk

回答

1

當您在學習SQL時,您應該注意的第一件事是您使用的連接語法已超過二十年前過時。奇怪的是,你學會了這樣的;你必須使用一本非常非常古老的SQL書。連接表t1和t2的正確方法是from t1 inner join t2 on t2.colx = t1.coly

你說你在桌子上有三組條件,這導致三個查詢結果集,你想要結合(你可以用UNION ALL)。但有些記錄不止一個集合,你不想重複。這是全部嗎?你可以用UNION,這與它的兄弟UNION ALL不僅膠水結果放在一起實現這一點,同時也刪除重複:

select col1, col2, col3 
from t1 
join t2 on t2.colx = t1.coly 
where t1.col4 = 4 or t1.col5 = 5 
union 
select col1, col2, col3 
from t1 
join t2 on t2.colx = t1.coly 
where t1.col4 = 44 or t1.col5 = 55; 

但是,您可以通過組合條件實現這個簡單得多:

select col1, col2, col3 
from t1 
join t2 on t2.colx = t1.coly 
where t1.col4 = 4 or t1.col5 = 5 or t1.col4 = 44 or t1.col5 = 55; 

最後一行可以簡化爲

where t1.col4 in (4, 44) or t1.col5 in (5, 55); 

順便說一下。那已經是你以後還是有什麼更多?

更新:從您的意見到您的請求我收集你想對你的記錄排序。什麼是第一條件設置相匹配是一個組,然後從剩餘的記錄那些符合第二個條件集B和其餘的是C.這裏是如何:

select col1, col2, col3, 
    case when t1.col4 = 4 or t1.col5 = 5 then 'A' 
     when t1.col4 = 44 or t1.col5 = 55 then 'B' 
     else 'C' 
    end as grp 
from t1 
join t2 on t2.colx = t1.coly 
where t1.col4 in (4, 44, 444) and t1.col5 in (5, 55, 555); 

或者更一般地說:

select col1, col2, col3, 
    case when <condition set 1> then 'A' 
     when <condition set 2> then 'B' 
     else 'C' 
    end as grp 
from t1 
join t2 on t2.colx = t1.coly 
where (<condition set 1>) or (<condition set 2>) or (<condition set 3>); 

還有一次更新:如果你想獨自選擇C,簡單地套用所有的條件如下:

select col1, col2, col3 
from t1 
join t2 on t2.colx = t1.coly 
where (<condition set 3>) 
and not (<condition set 1>) 
and not (<condition set 2>); 
+0

謝謝你回來發佈更新,經過一些試驗和錯誤,我已經完成了所需要的。並且完全贊同我的老派內在聯接只是從業務已經存在的舊腳本中挑選出來的。有趣的事情,雖然業務是16歲,所以我想他們開始與過時的語法!我在學習的過程中,仍然沒有得到適當的書籍/課程的投資,但我認爲這是我應該邁出的一步。再次感謝你,非常感謝。 – afropunk