2013-07-08 3 views
1

Отказ от ответственности: Я не уверен, как правильно называть этот вопрос, поэтому я приношу свои извинения, если он уже был задан. Вопросы, которые я нашел с похожими заголовками и содержанием, не касались моей проблемы.SQL Присоединиться к нескольким строкам одной таблицы

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

В конечном счете, мне нужен запрос sql, который выбирает контент в разделе «Проблемы, которые я хочу», а затем на основе идентификатора выбирает правильные значения из «Текст». Я использую соединения, но я не знаю, чтобы заставить его работать, когда мне нужно несколько строк. Я хотел бы иметь столбец А на выходе для совпадающих идентификаторов и значения Text.Field для A и столбца B для совпадающих идентификаторов и значения Text.Field B.

Как я могу это сделать ?

Я вытягивать из среды Netezza, так Pivot не доступен

Благодаря

Пример Структура:

Issues Table: 
|ID|Column1|Column2| 
-------------------- 
|0 |  17|  18| 
|1 |  19|  20| 

Text Table: 
|ID| Field| Value | 
-------------------- 
|0 |  A|  30| 
|0 |  B|  31| 
|1 |  A|  40| 
|2 |  B|  41| 

Output: 
|ID|Column1|Column2|Column3 (Field = 'A') | Column4 (Field = 'B')| 
------------------------------------------------------------------ 
| 0|  17|  18|     30 |     31 | 
| 1|  19|  20|     40 |     41 | 
+0

Есть ли от 1 до многих отношений между таблицами Проблемы и текст? – STLDeveloper

+0

Вы имеете в виду, что 1 ряд вопросов соответствует нескольким строкам в тексте? Да. Проблемы имеют идентификатор в качестве первичного ключа. Текст использует идентификатор и поле. –

+0

Ключевое слово, которое вы ищете, это 'pivot' - см. Http://stackoverflow.com/questions/tagged/pivot+sql –

ответ

3
SELECT 
    Issues.ID, 
    Issues.Column1, 
    Issues.Column2, 
    Text.Value Column3, 
    Text2.Value Column4 
FROM 
    Issues LEFT OUTER JOIN Text ON Text.ID = Issues.ID AND Text.Field = 'A' 
    LEFT OUTER JOIN Text AS Text2 ON Text2.ID = Issues.ID AND Text2.Field = 'B' 
+0

Теперь я набираю визуальное описание структуры таблицы, но если вы видите второй абзац описания, вы можете видеть, что это не сработает. Для текста требуются два основных ключа. Я хотел бы иметь разные столбцы в выводе, основываясь на значении ключа поля. –

+0

Я опубликовал полное описание выше. Я просто добавил пример таблицы. –

+0

Кроме того, если вы еще не видели другие комментарии, Pivot недоступен. Я использую Netezza –

2

Вы можете также использовать агрегатную функцию с выражение CASE для получения результата:

select i.id, 
    i.column1, 
    i.column2, 
    max(case when t.field='A' then t.value end) Column3, 
    max(case when t.field='B' then t.value end) Column4 
from issues i 
left join text t 
    on i.id = t.id 
group by i.id, i.column1, i.column2; 

См SQL Fiddle with Demo

1

Лично я бы сказал, оставил присоединяется немного расточительно и не требуется, хотя иногда требуется в другом случае (UGG)

Убедитесь, что поля Поле/ID все имеют индексы, и это будет супер быстро

SELECT 
    Issues.ID, 
    Issues.Column1, 
    Issues.Column2, 
    TextA.Value as Column3, 
    TextB.Value as Column4 
FROM 
    Issues 
    Text as TextA 
    Text as TextB 
WHERE 
    TextA.ID = Issues.ID 
    AND TextA.Field = 'A' 
    AND TextB.ID = Issues.ID 
    AND TextB.Field = 'B' 
Смежные вопросы