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 与单个表的多行的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server - 连接表,使多行变成一行

从单个表的一行中添加多行

带有join语句的sql中多行的总和

SQL Server JOIN 返回多行 - 左侧需要一行

如何在从多个表中获取多行的同时删除 sql JOIN 中的重复项

SQL Server中的SUM,在JOIN的一侧有多行,另一侧在另一侧作为比较