2013-07-08 64 views
1

声明:我不知道如何正确地标题这个问题,所以我很抱歉,如果它已被问。我用类似的标题和内容找到的问题没有解决我的问题。SQL与单个表的多行加入

我有两个表,问题和文本。问题和文本都共享一个用作问题主键的ID列。文本使用ID和字段作为键列。

最终我想要一个sql查询来选择我想要的问题中的内容,然后根据ID从文本中选择正确的值。我一直在使用连接,但当我想要多行时,我不知道该如何工作。我希望在匹配的ID的输出中有A列,A的Text.Field值为B,匹配ID为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行问题对应于文本中的多行?是。问题有ID作为主键。文本使用ID和字段。 –

+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

现在我正在打印表格结构的可视化描述,但是如果您看到描述的第二段,则可以看到这不起作用。文本需要两个主键。我想根据Field键的值在输出中有不同的列。 –

+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

个人而言,我会说离开联接是有点浪费,而不是必需的,但在其他情况下(雪地)偶尔需要

确保现场/ 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'