2016-10-03 8 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列を持つテーブルを持っています別の大きなソフトウェアに必要な設計時に知られていない列のプレースホルダ。 KeyValue列の特定の値に基づいてレコードを取得する必要があります。この場合、希望の値Foo、Bar、Bazを呼び出しましょう。検索される各レコードは、3つの値をすべて持っていなければなりません。ここで

は、私は労働組合を使用してみましたクエリです:

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

列別名に二重引用符を使用します。 '' Foo''です。単一引用符は文字列リテラルのためのものです。 – 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サブクエリの代わりに、労働組合です。ユニオンは、複数の行ソースを1つの行ソースに結合しますが、必要なのは、単一の行に対して、複数のテーブルから値をフェッチしたいということです。

例:

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

あなたはしませんでしたまず第一に3番目の選択クエリの前に 'union'を入れてください。

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のALL」を使用する必要があります唯一の '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」の違いがわかります。

ありがとうございました

関連する問題