2010-12-20 88 views
1

我有兩個名爲account和assignedgroup的表。在帳戶表中有兩列名爲ID和sourceaccount和In分配組我有兩列名爲ID和分配組。查詢加入條件

我想通過加入帳戶和分配組表來選擇ID。我做了這樣的事情:

select a.ID 
from account a 
    left outer join assignedgroup b 
    on a.sourceaccount = b.assignedgorup 

,但我得到空作爲輸出的原因是在sourceaccount的值都是這樣

sourceaccount:

sample 
sample 

和而assignedgroup的值像這樣

分配到的組:

sample-L1 
sample-P-L1 

任何人都可以幫助我如何加入這兩個表?

我想在sourceaccount和assignedgroup中都有樣本值的情況下獲取所有ID。

它將樣本與樣本-L1進行比較,因爲它們不相等,它返回null,但即使它具有類似的值,我也需要該ID。我的意思是,如果列值的某些部分匹配,那麼我也希望顯示這些值。

+0

你不能加入不共享密鑰的表...... – Hoff 2010-12-20 17:10:00

+0

@Hoff:真的嗎? – Quassnoi 2010-12-20 17:10:32

回答

1
SELECT a.id 
FROM account a 
LEFT JOIN 
     assignedgroup b 
ON  b.assignedgorup LIKE a.sourceaccount + '-%' 
+0

即使數據庫設計必須是討厭的,如果你需要一個解決方案,我認爲這是它。 – ndtreviv 2010-12-20 17:16:43

+0

此解決方案的問題在於,如果您碰巧有兩個值不同的帳戶,但具有類似名稱(如Sam和Sample),則該方法無效。他們都會加入相同的記錄。 – HLGEM 2010-12-20 17:18:18

+0

非常感謝你Quassnoi。它爲我工作。我知道數據庫設計是令人討厭的,但我已被授予這樣做。 – Sam 2010-12-20 17:22:24

0

顯然你的數據庫結構有缺陷。如果您需要分配組的第一部分加入源帳戶,則應將其存儲在單獨的列中。 YOu可以做一些操作來獲得正確的值,但改變數據庫結構是最好的解決方案,因爲在連接中進行的任何數據操作都非常昂貴(並且很可能會引入錯誤)。

0

由於這兩個表內的實際數據實際上並不匹配,因此除非您開始對這些表中的數據性質做出一些相當廣泛的假設,否則您無法在這些表中加入這些行。例如,這可能工作:

SELECT a.ID 
from Account a 
    left outer join AssignedGroup b 
    on a.sourceaccount = left(b.assignedgroup, 6) 

,或者更一般地,

SELECT a.ID 
from Account a 
    left outer join AssignedGroup b 
    on a.sourceaccount = left(b.assignedgroup, len(a.sourceaccount)) 

然而,這是真正可怕的代碼,邏輯和數據庫的設計,我也只能用這個,而tyring排查和/或修復混亂的數據。

+0

@ Quassnoi的LIKE子句也可以工作,但它仍然是一個廣泛的假設和糟糕的設計。 – 2010-12-20 17:14:37

+1

我曾經下過一個服務器,加入a到b,根據a的長度對b進行子串...(加上其他一些同樣愚蠢的邏輯) – cjk 2010-12-20 17:22:50

+0

感謝Philip。它也爲我工作。 – Sam 2010-12-20 17:22:57