SQL Join 与单个表的多行
Posted
技术标签:
【中文标题】SQL Join 与单个表的多行【英文标题】:SQL Join with Multiple Rows of a Single Table 【发布时间】:2013-07-08 20:17:11 【问题描述】:免责声明:我不确定如何正确命名这个问题,所以如果已经有人问过,我深表歉意。我发现的标题和内容相似的问题并没有解决我的问题。
我有两个表,问题和文本。问题和文本都共享一个 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 |
【问题讨论】:
问题表和文本之间是否存在一对多的关系? 您的意思是 1 行问题对应于文本中的多行?是的。问题以 ID 作为主键。文本使用 ID 和字段。 您要查找的关键字是pivot
- 请参阅***.com/questions/tagged/pivot+sql
如果您列出您的表结构会很有帮助,至少在它们的主键、相关外键和您想要的输出列方面。
我从 Netezza 环境中提取,所以 Pivot 不可用。
【参考方案1】:
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'
【讨论】:
我现在正在输入表结构的可视化描述,但如果您看到描述的第二段,您会发现这不起作用。文本需要两个主键。我想根据 Field 键的值在输出中有不同的列。 我已经在上面发布了完整的描述。我刚刚添加了表格示例。 另外,如果您还没有看过其他 cmets,则 Pivot 不可用。我正在使用 Netezza 我收到错误:不支持这种形式的相关查询。您对如何做有任何其他想法,还是我只需要在 SQL 环境之外编译数据?【参考方案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
【讨论】:
【参考方案3】:我个人认为左连接有点浪费而且不是必需的,尽管在其他情况下偶尔需要 (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'
【讨论】:
以上是关于SQL Join 与单个表的多行的主要内容,如果未能解决你的问题,请参考以下文章