【问题标题】:SQL Join with Multiple Rows of a Single TableSQL Join 与单个表的多行
【发布时间】: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 - 请参阅stackoverflow.com/questions/tagged/pivot+sql
  • 如果您列出您的表结构会很有帮助,至少在它们的主键、相关外键和您想要的输出列方面。
  • 我从 Netezza 环境中提取,所以 Pivot 不可用。

标签: sql join netezza


【解决方案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'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-02
      • 2021-08-12
      • 1970-01-01
      • 2021-03-27
      • 2020-09-15
      • 1970-01-01
      • 2013-06-11
      • 1970-01-01
      相关资源
      最近更新 更多