免责声明:我不确定如何正确地标题这个问题,所以如果已经提出问题我会道歉。我发现的类似标题和内容的问题没有解决我的问题。
我有两个表,问题和文字。问题和文本都共享一个ID列,作为问题的主键。 Text使用ID和Field作为键列。
最终我想要一个SQL查询来选择我想要的问题中的内容,然后根据ID从Text中选择正确的值。我一直在使用连接,但是当我想要多行时,我不知道它能让它工作。我希望输出中的列A用于匹配的ID,Text.Field值为A,列B用于匹配的ID,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 :(得分: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'
答案 1 :(得分: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;
答案 2 :(得分:1)
我个人认为左连接有点浪费而且不需要,但在其他情况下偶尔需要(ugg)
确保Field / 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'