SQL加入单个表的多行

时间:2013-07-08 20:17:12

标签: sql join netezza

免责声明:我不确定如何正确地标题这个问题,所以如果已经提出问题我会道歉。我发现的类似标题和内容的问题没有解决我的问题。

我有两个表,问题和文字。问题和文本都共享一个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 | 

3 个答案:

答案 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;

请参阅SQL Fiddle with Demo

答案 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'