2015-01-06 3 views
1

В моей базе данных есть плохо спроектированная таблица, которая содержит некоторую информацию, которую мне нужно извлечь. Supose У меня есть следующий запрос:Подзапрос с несколькими столбцами

SELECT 
    (SELECT I FROM X WHERE X.A = FOO AND X.B = KEY), 
    (SELECT J FROM X WHERE X.A = BAR AND X.B = KEY), 
    (SELECT K FROM X WHERE X.A = BAZ AND X.B = KEY) 

Мне нужно развернуть запрос, чтобы выбрать другие поля. Моя первая мысль была такой:

SELECT 
    (SELECT I FROM X WHERE X.A = FOO AND X.B = KEY), 
    (SELECT J FROM X WHERE X.A = BAR AND X.B = KEY), 
    (SELECT K FROM X WHERE X.A = BAZ AND X.B = KEY) 
    (SELECT L, M, N FROM X WHERE X.A = QUX AND X.B = KEY) 

Однако я получаю сообщение об ошибке о том, что подзапрос, который выбирает столбцы может только принести один столбец, если он не будет введен с EXISTS пункта. Я мог бы написать последний подзапрос как таковой:

(SELECT L, M, N FROM X AS OUTER 
    WHERE EXISTS 
     (SELECT ID FROM X WHERE X.A = QUX AND X.B = KEY AND X.ID = OUTER.ID)(

Не будет ли это решение излишне тяжелым? Есть ли другое решение?

РЕДАКТИРОВАТЬ:

мне нужно, чтобы извлечь информацию в одной строке. Я также должен упомянуть, что нет никакой гарантии, что каждый X.A присутствует (могут быть ключи, которые имеют только FOO, другие с BAR и QUX и т. Д.), Поэтому соединение невозможно.

EDIT: @Saharsh Шах просил некоторые образцы данных:

 
|X.B |X.A|X.I  |X.J  |X.K  |X.L  |X.M  |X.N  | 
|KEY1|FOO|ICONTENT|  |  |  |  |  | 
|KEY1|BAR|  |JCONTENT|  |  |  |  | 
|KEY1|BAZ|  |  |KCONTENT|  |  |  | 
|KEY1|QUX|  |  |  |LCONTENT|MCONTENT|NCONTENT| 
|KEY2|BAR|  |JCONTENT|  |  |  |  | 
|KEY3|FOO|ICONTENT|  |  |  |  |  | 
|KEY3|QUX|  |  |  |LCONTENT|MCONTENT|NCONTENT| 

и ожидаемый результат: для ключа 1:

 
X.I  |X.J  |X.K  |X.L  |X.M  |X.N  | 
ICONTENT|JCONTENT|KCONTENT|LCONTENT|MCONTENT|NCONTENT| 

Для ключа 2:

 
X.I  |X.J  |X.K  |X.L  |X.M  |X.N  | 
     |JCONTENT|  |  |  |  | 

Для ключ 3:

 
X.I  |X.J  |X.K  |X.L  |X.M  |X.N  | 
ICONTENT|  |  |LCONTENT|MCONTENT|NCONTENT| 
+0

я редактировал запросы, чтобы исправить параметры. Первый столбец запросов должен быть X.A для всех подзапросов. –

ответ

1

Использование СЛУЧАЙ заявление для проверки условиям

Попробуйте это:

SELECT X.B, 
     MAX(CASE WHEN X.A = FOO THEN I ELSE '' END) AS I, 
     MAX(CASE WHEN X.A = BAR THEN J ELSE '' END) AS J, 
     MAX(CASE WHEN X.A = BAZ THEN K ELSE '' END) AS K, 
     MAX(CASE WHEN X.A = QUX THEN L ELSE '' END) AS L, 
     MAX(CASE WHEN X.A = QUX THEN M ELSE '' END) AS M, 
     MAX(CASE WHEN X.A = QUX THEN N ELSE '' END) AS N 
FROM X 
WHERE X.B = KEY 
GROUP BY X.B; 
+0

@ez pz это решение должно работать тогда для вашего вопроса. – Mukund

+0

Это возвращает несколько строк, определенных X.A. Моя идея состоит в том, чтобы сгруппировать разные столбцы в одну строку. –

+0

Он был добавлен в мое сообщение. –

0

Это можно сделать 2-мя способами: -

select i, j , k , l , m, n 
from x 
where i in (select i from x where x.a = 'FOO' or x.B = 'KEY') and 
j in (select j from x where x.b = 'BAR' or x.B = 'KEY') and 
k in (select k from x where x.c = 'BAZ' or x.B = 'KEY') 

или другой способ:

select (select count(i) from x where x.a = 'foo') as i , (select count(j) from x where x.b in ('KEY', 'BAR') as j , (select count(k) from x where x.c = 'BAZ' and x.B = 'KEY') as k , l, m , n 
from x 
+0

Первый запрос, который вы отправили, не извлекает столбцы L, M и N, а второй запрос не работает, потому что мне нужно агрегировать результаты подзапросов в одну строку. Я также исправил ошибку в столбцах запроса, не могли бы вы перечитать мои запросы? –

+0

Я обновил оба моих вопроса – sam

0

Вы можете использовать производную таблицу, как это

Select foo.I, bar.J , baz.K, qux.L, qux.M ,qux.N from x 
left outer join (Select * from x where x.A = foo) foo on foo.b = x.b 
left outer join (Select * from x where x.A = bar) bar on bar.b = x.b 
left outer join (Select * from x where x.A = baz) baz on baz.b = x.b 
left outer join (Select * from x where x.A = qux) qux on qux.b = x.b 
where x.B = key 

, если вы уверены, что данные с = Foo, ... существует, то внутреннее соединение также применим

+0

Это не удается, потому что у ключа могут быть не все записи FOO, BAR, BAZ и QUX. В этом случае ключ, который не имеет записи QUX, не будет получать таблицы FOO, BAR и BAZ. –

+0

@EZPZ Я отредактировал свой ответ – RezaRahmati

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