2

免责声明:我不确定如何正确命名这个问题,所以如果已经被问到,我很抱歉。我发现的标题和内容相似的问题并没有解决我的问题。

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

最终,我想要一个 sql 查询来选择我想要的问题中的内容,然后根据 ID 从 Text 中选择正确的值。我一直在使用连接,但是当我想要多行时,我不知道如何让它工作。我想在输出中包含匹配 ID 的列 A 和 A 的 Text.Field 值,以及匹配 ID 的列 B 和 B 的 Text.Field 值。

我将如何实现这一目标?

我从 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 | 
4

3 回答 3

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'
于 2013-07-08T20:30:01.443 回答
3

您还可以使用带有 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

于 2013-07-08T21:26:39.717 回答
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'
于 2014-03-10T09:02:06.267 回答