2011-04-01 97 views
0

嗨 我有兩個選擇查詢,我想將它們合併成5列一個表作爲Id, ClientId, Height, EyeColor, HairColor如何合併兩個選擇查詢產生的一種表

查詢是:

SELECT ClientCharacteristic.Id 
    , ClientCharacteristic.ClientId 
    , ClientCharacteristic.Height 
    , GeneralLookup.LookupItem as EyeColor 
FROM dbo.ClientCharacteristic 
    INNER JOIN dbo.GeneralLookup 
    ON GeneralLookup.Id=ClientCharacteristic.glEyeColorId 



SELECT ClientCharacteristic.Id 
    , ClientCharacteristic.ClientId 
    , ClientCharacteristic.Height 
    , GeneralLookup.LookupItem as HairColor 
FROM dbo.ClientCharacteristic 
    INNER JOIN dbo.GeneralLookup 
    ON GeneralLookup.Id=ClientCharacteristic.glHairColorId 

回答

6

通常,您會使用UNION來「合併」查詢。 但是,在這種特殊情況下,會導致包含EyeColorHairColor的單個列在其他重複行中出現。我懷疑這就是你想要的。更好的方法可能是別名,你的連接表,這樣就可以參加兩次:

SELECT 
    ClientCharacteristic.Id, 
    ClientCharacteristic.ClientId, 
    ClientCharacteristic.Height, 
    EyeLookup.LookupItem as EyeColor, 
    HairLookup.LookupItem as HairColor 
FROM 
    dbo.ClientCharacteristic 
    INNER JOIN dbo.GeneralLookup AS EyeLookup 
    ON EyeLookup.Id=ClientCharacteristic.glEyeColorId 
    INNER JOIN dbo.GeneralLookup AS HairLookup 
    ON HairLookup.Id=ClientCharacteristic.glHairColorId 

這裏要注意的關鍵一點是AS子句中的INNER JOIN條款,其別名連接表爲目的查詢的其餘部分。這允許您在不同的鍵上多次連接相同的表格,以便可以爲不同目的引用它。

1

您可以使用UNION將兩個查詢合併爲一個。

+1

這是一個廣泛的聲明。 'UNION'如何在這兩個查詢中處理'HairColor'和'EyeColor'之間的區別? – David 2011-04-01 14:55:21

+0

@大衛:對不起,你是對的 - 我忽略了這個問題的細節! +1爲您的答案。 – Town 2011-04-01 15:24:54

1
SELECT ClientCharacteristic.Id, ClientCharacteristic.ClientId, ClientCharacteristic.Height, GeneralLookup.LookupItem as EyeColor, '' as HairColor  
FROM dbo.ClientCharacteristic INNER JOIN dbo.GeneralLookup ON GeneralLookup.Id=ClientCharacteristic.glEyeColorId 
UNION 
SELECT ClientCharacteristic.Id, ClientCharacteristic.ClientId, ClientCharacteristic.Height, '' as EyeColor, GeneralLookup.LookupItem as HairColor  
FROM dbo.ClientCharacteristic INNER JOIN dbo.GeneralLookup ON GeneralLookup.Id=ClientCharacteristic.glHairColorId 
+0

您將如何解決「HairColor」和「EyeColor」被合併爲單列而不是其他重複行的事實? – David 2011-04-01 14:51:39

+0

我雖然是要合併它們。已經固定了查詢以將它們放置在不同的行中 – dcarneiro 2011-04-01 14:55:55

+0

因此,數據中的每個「人物」將有兩個結果行,一個是他們的頭髮顏色和空眼睛顏色,另一個是他們的眼睛顏色和空頭髮顏色?這可能不會很直觀...... – David 2011-04-01 14:58:06

5

unionunion all應該只要列排隊是相同類型的(或可隱式轉換)做

繼戴維斯諮詢和重新讀取的問題列將

SELECT ClientCharacteristic.Id, 
     ClientCharacteristic.ClientId, 
     ClientCharacteristic.Height, 
     Eye.LookupItem as EyeColor 
     Hair.LookupItem AS HairColor 
FROM 
    dbo.ClientCharacteristic 
INNER JOIN 
    dbo.GeneralLookup Eye 
    ON Eye.Id=ClientCharacteristic.glEyeColorId  
INNER JOIN 
    dbo.GeneralLookup Hair 
    ON Hair.Id=ClientCharacteristic.glHairColorId 
+1

這些類型可能會隱式轉換,但我懷疑軟件中的「HairColor」和「EyeColor」應該是一個單列用於任何業務目的。 – David 2011-04-01 14:50:33

-1

您可以使用去UNION操作是這樣的:

SELECT ClientCharacteristic.Id, ClientCharacteristic.ClientId, ClientCharacteristic.Height, GeneralLookup.LookupItem as EyeColor 
FROM dbo.ClientCharacteristic INNER JOIN dbo.GeneralLookup ON GeneralLookup.Id=ClientCharacteristic.glEyeColorId 
UNION 
SELECT ClientCharacteristic.Id, ClientCharacteristic.ClientId, ClientCharacteristic.Height, GeneralLookup.LookupItem as HairColor 
FROM dbo.ClientCharacteristic INNER JOIN dbo.GeneralLookup ON GeneralLookup.Id=ClientCharacteristic.glHairColorId 

請注意,UNION運算符會丟棄重複的元組。要在結果表中保留重複值,請使用UNION ALL

+0

聯合加入行,而不是列 – asma 2011-04-01 14:52:34

+0

確實,誤解了問題。很快會糾正它。 – CGK 2011-04-01 16:00:31