2011-05-01 58 views
4

我有一個SQL查詢運行良好,除了我想帶第一個數據庫中的另一列的結果與它。這是我目前有:SQL UNION查詢與結果中的額外字段

SELECT parts1.PART_NBR, parts1.NIIN 
FROM parts1 
WHERE parts1.PART_NBR='$pn' 
UNION 
SELECT parts2.REFERENCE_NUMBER, parts2.NIIN 
FROM parts2 
WHERE parts2.REFERENCE_NUMBER='$pn' 

這就是我基本上想要的(當然這不會工作):

SELECT parts1.PART_NBR, parts1.NIIN, parts1.ANOTHER_FIELD 
FROM parts1 
WHERE parts1.PART_NBR='$pn' 
UNION 
SELECT parts2.REFERENCE_NUMBER, parts2.NIIN 
FROM parts2 
WHERE parts2.REFERENCE_NUMBER='$pn' 

我怎樣寫的查詢,以便它做同樣的事情,但實際上帶回結果中的額外字段?

回答

5

創建一個空場,返回NULL

SELECT parts1.PART_NBR, parts1.NIIN, parts1.ANOTHER_FIELD 
FROM parts1 
WHERE parts1.PART_NBR='$pn' 
UNION ALL 
SELECT parts2.REFERENCE_NUMBER, parts2.NIIN, NULL AS ANOTHER_FIELD 
FROM parts2 
WHERE parts2.REFERENCE_NUMBER='$pn' 

編輯: 從您的評論,你所看到的結果

Part Number: 21223 NIIN: 008194914 Name: CAPACITOR 
Part Number: 21223 NIIN: 011241926 Name: HEAT SINK 
Part Number: 21223 NIIN: 003901600 Name: KNIFE 
Part Number: 21223 NIIN: 003901600 Name: 
Part Number: 21223 NIIN: 008194914 Name: 
Part Number: 21223 NIIN: 011241926 Name: 

第一個結果從表parts1第二次來從parts2,空白Name字段是您返回的地方NULL

從你給出的信息我不明白你爲什麼使用UNION從這兩個表中得到結果,因爲它們似乎包含相同的信息,除了第一個表也有Name字段。

爲了選擇零件名稱,零件/參考號碼上的表格會不會更好JOIN

編輯: 正如你所說的在您的評論,以前你都拿到,因爲使用UNIONDISTINCT結果集。在NULL字段中,行不再是唯一的,查詢將返回所有行。

我在評論中說我沒有看到當前的UNION聲明爲你做了什麼,因爲它看起來同樣的信息都是表格。這個查詢有沒有比你告訴我們的更多的?

+0

當我這樣做,我得到了相同的結果返回兩次只有第一套具有額外的字段和seconed集犯規。 – Erik 2011-05-01 02:47:41

+0

有趣的是,你正在使用哪個數據庫(SQL Server,MySQL等)? – Tony 2011-05-01 02:50:28

+0

編號:21223 NIIN:008194914名稱:電容 編號:21223 NIIN:011241926名稱:HEAT SINK 編號:21223 NIIN:003901600名稱:刀 編號:21223 NIIN:003901600名稱: 編號:21223 NIIN :008194914名稱: 部件號:21223 NIIN:011241926名稱: – Erik 2011-05-01 02:55:19

0

簡單,如下:

select part_number, niin, max(field) 
from (  
    SELECT parts1.PART_NBR part_number, parts1.NIIN niin, parts1.ANOTHER_FIELD field 
    FROM parts1 
    WHERE parts1.PART_NBR='$pn' 
    UNION 
    SELECT parts2.REFERENCE_NUMBER part_number, parts2.NIIN niin, "" field 
    FROM parts2 
    WHERE parts2.REFERENCE_NUMBER='$pn') 
group by part_number, niin 

你只需要適應在第二個查詢的佔位符以匹配第一個的額外字段位置。

+0

這只是將結果帶回兩次。他們第二次沒有那個領域。像: 編號:21223 NIIN:008194914名稱:電容 編號:21223 NIIN:011241926名稱:HEAT SINK 編號:21223 NIIN:003901600名稱:刀 編號:21223 NIIN:003901600名稱: 型號:21223 NIIN:008194914姓名: 部件號:21223 NIIN:011241926姓名: – Erik 2011-05-01 02:52:00

+0

您能否舉一個您預期的輸出喜歡的例子嗎? – cmutt78 2011-05-01 03:03:51

+0

零件號:21223 NIIN:008194914名稱:CAPACITOR 零件號碼:21223 NIIN:011241926名稱:HEAT SINK 零件號碼:21223 NIIN:003901600名稱:KNIFE – Erik 2011-05-01 03:06:02

0

您必須有匹配的列,但是您可以在第二個列中放置一個「假」列,它將返回null或其他任何默認值。

SELECT parts1.PART_NBR, parts1.NIIN, parts1.ANOTHER_FIELD 
FROM parts1 
WHERE parts1.PART_NBR='$pn' 
UNION 
SELECT parts2.REFERENCE_NUMBER, parts2.NIIN, NULL AS ANOTHER_FIELD 
FROM parts2 
WHERE parts2.REFERENCE_NUMBER='$pn' 
2
SELECT parts.PART_NBR, parts.NIIN, parts1.ANOTHER_FIELD 
FROM (
     SELECT parts1.PART_NBR, parts1.NIIN 
     FROM parts1 
     WHERE parts1.PART_NBR = '$pn' 
     UNION 
     SELECT parts2.REFERENCE_NUMBER, parts2.NIIN 
     FROM parts2 
     WHERE parts2.REFERENCE_NUMBER = '$pn' 
    ) AS parts(PART_NBR, NIIN) 
    LEFT OUTER JOIN parts1 
    ON parts.PART_NBR = parts1.PART_NBR AND 
     parts.NIIN = parts1.NIIN