2014-01-17 12 views
7

私はTESTテーブルのサンプルデータを次ていますサブクエリを避ける方法はありますか?

CREATE TABLE TEST(
f1 varchar(50) NULL, 
f2 varchar(50) NULL, 
flag int NULL); 

INSERT INTO [test]([f1],[f2],[flag]) VALUES('P','a',1); 
INSERT INTO [test]([f1],[f2],[flag]) VALUES('P','b',0); 
INSERT INTO [test]([f1],[f2],[flag]) VALUES('Q','c',1); 
INSERT INTO [test]([f1],[f2],[flag]) VALUES('Q','d',0); 
INSERT INTO [test]([f1],[f2],[flag]) VALUES('R','e',1); 
INSERT INTO [test]([f1],[f2],[flag]) VALUES('S','f',0); 

私はこの結果をしたい:

f1 f2whenFlagIs1 f2whenFlagIs0 
P a    b 
Q c    d 
R e    NULL 
S NULL   f 

次のクエリは、同じ結果を持つように書かれています

SELECT isnull(test1.f1,test0.f1) f1, test1.f2 f2whenFlagIs1 , test0.f2 AS f2whenFlagIs0 
FROM 
(select * from test where flag = 1) AS test1 full JOIN 
(select * from test where flag = 0) AS test0 
ON test1.f1 = test0.f1 

ですサブクエリを避ける方法はありますか?

+1

+1サンプルデータ*と*望ましい結果!ほとんどの質問はどちらも提供していません。どちらも気にしないでください。 –

+0

@abdkok:( 'f1'、' flag')列にPRIMARY KEY/UNIQUE制約/一意索引がありますか? –

+0

この構文はSQL Serverであるため、Oracleタグを削除しました。 –

答えて

3

はここだけf1 + flagの組み合わせ毎に一つの値があることを仮定して、サンプルデータを考えると、2つの方法があります。

SELECT f1, 
    f2WhenFlagIs1 = MAX(CASE WHEN flag = 1 THEN f2 END), 
    f2WhenFlagIs0 = MAX(CASE WHEN flag = 0 THEN f2 END) 
FROM dbo.TEST 
GROUP BY f1; 

それとも

SELECT f1, f2WhenFlagIs1 = [1], f2WhenFlagIs0 = [0] 
FROM dbo.TEST AS t 
PIVOT (MAX(f2) FOR flag IN ([0],[1])) AS p; 

あなたはより多くを持っていることができる場合任意の値の1つの値よりも大きい場合は、目的の結果をよりよく定義する必要があります。

+0

あなたの結果をお寄せいただきありがとうございます。どれが大規模データで効率的ですか? – abdkok

+0

@abdkokいいえ、私は決してパフォーマンステストを行っていません。ただし、ハードウェア、スキーマ、インデックス、データにアクセスできるだけで、「大規模データ」の意味を理解することができます。 –

関連する問題