2016-10-03 60 views
1

UPDATE:SQL - 如何將結果從一個UNION結合

按照要求,這裏是「真正的」 SQL:

SELECT  p.ReferenceNumber, 
      p.Name, 
      '' as 'Size of Prize', 
      '' as 'Complexity', 
      pfc.ConfigurationValue as 'Strategic Fit' 
FROM  FormConfigurations AS fc INNER JOIN 
         ProjectForms AS pf ON pf.FormID = fc.FormID INNER JOIN 
         ProjectFormConfigurations AS pfc ON pfc.ProjectFormID = pf.ID AND pfc.FormConfigurationID = fc.ID INNER JOIN 
         Project AS p ON p.ID = pf.ProjectID 
WHERE  (fc.[Key] = 'Strategic Fit') 
GROUP BY p.ReferenceNumber, p.Name, pfc.ConfigurationValue, fc.[Key] 

UNION 

SELECT  p.ReferenceNumber, 
      p.Name, 
      '' as 'Size of Prize', 
      pfc.ConfigurationValue as 'Complexity', 
      '' 'Strategic Fit' 
      FROM   FormConfigurations AS fc INNER JOIN 
         ProjectForms AS pf ON pf.FormID = fc.FormID INNER JOIN 
         ProjectFormConfigurations AS pfc ON pfc.ProjectFormID = pf.ID AND pfc.FormConfigurationID = fc.ID INNER JOIN 
         Project AS p ON p.ID = pf.ProjectID 
WHERE  (fc.[Key] = 'Complexity') 
GROUP BY p.ReferenceNumber, p.Name, pfc.ConfigurationValue, fc.[Key] 

UNION 

SELECT  p.ReferenceNumber, 
      p.Name, 
    pfc.ConfigurationValue as 'Size of Prize', 
    '' as 'Complexity', 
    '' as 'Strategic Fit' 
    FROM   FormConfigurations AS fc INNER JOIN 
         ProjectForms AS pf ON pf.FormID = fc.FormID INNER JOIN 
         ProjectFormConfigurations AS pfc ON pfc.ProjectFormID = pf.ID AND pfc.FormConfigurationID = fc.ID INNER JOIN 
         Project AS p ON p.ID = pf.ProjectID 
WHERE  (fc.[Key] = 'Projected EBIT') 
GROUP BY p.ReferenceNumber, p.Name, pfc.ConfigurationValue, fc.[Key] 

我其中有一個鍵值列充當表在設計時不知道柱子的佔位符,這是另一塊大型軟件所必需的。我需要根據KeyValue列中的某些值獲取記錄;在這種情況下,讓我們調用所需的值Foo,Bar和Baz。每個檢索到的記錄必須具有全部三個值,否則它們不應該顯示。

下面是我用工會試圖查詢:

SELECT KeyValue as 'Foo', 
     '' as 'Bar', 
     '' as 'Baz' 
FROM  Table1 
WHERE  KeyValue = 'Foo' 
UNION 
SELECT '' as 'Foo', 
     KeyValue as 'Bar', 
     '' as 'Baz' 
FROM  Table1 
WHERE  KeyValue = 'Bar' 
SELECT '' as 'Foo', 
     '' as 'Bar', 
     KeyValue as 'Baz' 
FROM  Table1 
WHERE  KeyValue = 'Baz' 

不幸的是,什麼情況是,我有鋸齒的記錄,而不是所有的填充列的一個記錄。也就是說,不是我的獲取所需的記錄類似下面的:

Foo  Bar  Baz 
-  -  - 
-  -  - 
-  -  - 
-  -  - 
-  -  - 

我,而不是讓這些:

Foo  Bar  Baz 
-    
     -  
       - 
-    
     -  
       - 

什麼我需要做什麼來糾正我的查詢?

+2

我認爲你需要加入表格。 –

+0

這確實是一個JOIN,而不是一個UNION –

+0

對列別名使用雙引號。 ' 「富」'。單引號用於字符串文字。 – jarlh

回答

0

試試這個

select t1.KeyValue as 'Foo', t2.KeyValue as 'Bar', t3.KeyValue as 'Baz', 
from Table1 t1, Table1 t2, Table1 t3 
where t1.KeyValue = 'Foo' and t2.KeyValue = 'Bar' and t3.KeyValue = 'Baz' 
+0

笛卡爾產品通常是一個非常糟糕的主意...... – Cine

+0

我知道,但他沒有給我們任何數據,我們可以爲他提供一個JOIN。 –

0

你需要使用什麼是選擇子查詢,而不是工會。聯合會將多個行源合併爲一個行源,但是您需要的是對於單個行,您需要從多個表中提取值。

例子:

select *, 
    (select KeyValue from table1 where somekey = outertable.somekey) as Foo 
from outertable where somerestrictions 
0

如果我理解你的需求,然後有很多方法,你提到的和簡單的方法之一是讓記錄:

SELECT KeyValue as 'Foo', 
     (SELECT KeyValue FROM zzz WHERE KeyValue = 'Bar') as 'Bar', 
     (SELECT KeyValue FROM zzz WHERE KeyValue = 'Baz') as 'Baz' 
FROM table1 
WHERE KeyValue = 'Foo' 
0

你沒有首先在第三個選擇查詢之前加上'union'。

如果你想消除重複行,你應該使用「UNION ALL」像如下:

SELECT KeyValue as 'Foo', 
 
     '' as 'Bar', 
 
     '' as 'Baz' 
 
FROM  Table1 
 
WHERE  KeyValue = 'Foo' 
 
UNION All 
 
SELECT '' as 'Foo', 
 
     KeyValue as 'Bar', 
 
     '' as 'Baz' 
 
FROM  Table1 
 
WHERE  KeyValue = 'Bar' 
 
UNION All 
 
SELECT '' as 'Foo', 
 
     '' as 'Bar', 
 
     KeyValue as 'Baz' 
 
FROM  Table1 
 
WHERE  KeyValue = 'Baz'

如果你不想以消除重複,那麼你應該使用只有 'UNION' 作爲像如下:

SELECT KeyValue as 'Foo', 
 
     '' as 'Bar', 
 
     '' as 'Baz' 
 
FROM  Table1 
 
WHERE  KeyValue = 'Foo' 
 
UNION 
 
SELECT '' as 'Foo', 
 
     KeyValue as 'Bar', 
 
     '' as 'Baz' 
 
FROM  Table1 
 
WHERE  KeyValue = 'Bar' 
 
UNION 
 
SELECT '' as 'Foo', 
 
     '' as 'Bar', 
 
     KeyValue as 'Baz' 
 
FROM  Table1 
 
WHERE  KeyValue = 'Baz'

我認爲這應該可以解決您的問題。 如果你願意,你可以看到'UNION'和'UNION ALL'之間的區別。

謝謝