【问题标题】:left join on non primary key在非主键上左连接
【发布时间】:2014-10-10 21:15:55
【问题描述】:

如何对具有公共列但没有 A 或 B 的主键的表 A 和 B 进行左连接。

公共列可能在两个表中都有一条或多条记录。我想显示表 A 中的所有行,并从 B 中为 A 中的这些记录提取其他数据。这可能吗?

表 A

Column1
1123
1123
1123
2234
2234
3344

表 B

Column1
1123
2234
2234
2234
2234

期望的输出

A.Column1 B.Column1
1123       1123
1123       1123
1123       1123
2234       2234
2234       2234
3344       NULL

【问题讨论】:

  • 是的,左连接应该可以工作。 select * from A left join B on A.col = B.col
  • @Rajesh left join on A on B with non primary key 输出的记录多于表 A 中的记录。我使用了错误的连接吗?
  • 您只想从 B 中选择一个值吗?你能给出样本数据和预期结果来试试吗
  • 是的,对于表 A 中的许多记录,表 B 将只有一个记录。例如表 A 可能有 1、2、3 条或更多 ID1122 记录,而表 B 只有 1 条 ID1122 记录
  • 我已经添加了一个答案,检查它是否有效,然后你可以接受。

标签: sql sql-server-2008


【解决方案1】:

根据最新的评论和期望的结果,这个查询应该可以工作。 由于存在重复值,因此需要从 TableB 中获取不同的值。

SELECT A.COLUMN1 , B.Column1
FROM TableA A
LEFT JOIN ( SELECT DISTINCT COLUMN1 FROM TableB ) B
on A.Column1 = B.Column1

【讨论】:

  • 我对 TableB 中的示例数据进行了更新。对于 TableA 中的记录,TableB 中的记录也可能更多
  • 运行查询后,您给它返回的记录比 TableA 中的记录多
  • 不知道为什么我看到更多的记录...你能建议我可以研究的任何东西吗?我检查了 TableA 的空值和非数值,我还添加了另一个 Where 子句来消除非数字......仍然是相同的结果
  • @user793468,你应该看到来自 A 的所有记录,而不是更多,你可以创建包含所有列数据的 sql fiddle,这样调试起来很容易
【解决方案2】:

您不需要在JOIN 中包含主键列(不过,由于索引,它通常更快)。只需使用您的公共字段作为连接条件:

SELECT a.field, b.field2
FROM a
LEFT JOIN b
  ON b.common = a.common
WHERE a.id = ???

【讨论】:

    【解决方案3】:

    我不确定你描述的场景有什么特别之处。我错过了什么吗?

    SELECT *
    FROM TABLEA TA
    LEFT JOIN TABLEB TB ON TA.COMMONFIELD = TB.COMMONFIELD
    

    【讨论】:

    • 在 B 上使用非主键在 A 上左连接输出的记录多于表 A 中的记录。我使用了错误的连接吗?
    • 不,如果表 B 中的连接条件与表 A 中的特定记录有 X 个匹配项,您将获得表 A 行的 X 个副本,该行与表 B 中的每个匹配行连接。如果X = 0 您将只获得表 B 字段的 NULL 表 A 记录 - 这是 OUTER 连接的属性。如果您使用 INNER 连接,在这种情况下您将获得零行。
    • 不知道为什么我被否决了...选民愿意解释一下吗?
    【解决方案4】:
    select * from A
    left outer join B on A.a = B.b
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-29
      • 2018-07-11
      • 1970-01-01
      • 1970-01-01
      • 2015-06-15
      • 1970-01-01
      • 2016-10-15
      • 1970-01-01
      相关资源
      最近更新 更多