2014-01-17 4 views
7

Я следующие примеры данных в тестовой таблице:Есть ли способ избежать подзапросов?

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 

Is есть ли способ избежать подзапросов?

+1

+1 для данных образца * и * желаемых результатов! Большинство вопросов не дают ни того, ни другого. –

+0

@abdkok: У вас есть PRIMARY KEY/UNIQUE ограничение/уникальный индекс на столбцах ('f1',' flag')? –

+0

Я удалил тег Oracle, потому что этот синтаксис SQL Server. –

ответ

3

Вот два способа, с учетом выборки данных, при условии, что может быть только одно значение для каждой комбинации f1 + flag:

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; 

Если вы можете иметь более чем одно значение для любой заданной пары f1, flag, вам нужно будет лучше определить желаемые результаты.

+0

Спасибо за ваши результаты. Какой из них эффективен в крупномасштабных данных? – abdkok

+0

@abdkok не знаю, я никогда не проводил никаких тестов производительности. Вы могли бы, тем не менее, особенно потому, что только у вас есть доступ к вашему оборудованию, схеме, индексам, данным и понимаете, что вы подразумеваете под «крупномасштабными данными» ... –

Смежные вопросы