【问题标题】:SQL Left Outer Join?SQL 左外连接?
【发布时间】:2016-12-20 17:31:04
【问题描述】:

我有一个应该根据唯一 ID 连接到另一个表的表。如果我这样做 LEFT OUTER JOIN ON 我会有重复的。如果我将DISTINCT 放入我的SELECT 中,我将获得正确数量的记录。然后,如果我在表中包含我所做的LEFT OUTER JOIN 中的任何字段,在这种情况下,我会再次得到重复项。这是我的查询:

SELECT DISTINCT
 Table1.fname,
 Table1.lname,
 Table2.address
FROM Table1
LEFT OUTER JOIN Table2
ON Table2.user_id = Table1.userid

在上面的示例中,我得到了重复,我也尝试过这样做:

LEFT OUTER JOIN (
  SELECT user_id
  FROM Table2
  GROUP BY user_id
) AS t2 ON Table1.user_id = t2.user_id

这给了我正确数量的记录,但我需要第二个表中的一些额外列,在我包含额外列之后,我再次得到重复,例如:

LEFT OUTER JOIN (
  SELECT user_id, address
  FROM Table2
  GROUP BY user_id, address
) AS t2 ON Table1.user_id = t2.user_id

我想知道我是否遗漏了什么,或者有更好的方法来处理这类问题。如果有人看到或知道更好的解决方案,请告诉我。

【问题讨论】:

  • 表2的主键是什么?
  • 您从 DISTINCT 获得了带有这些附加列的重复项,因为它们具有多个值。我们无法告诉您如何修复它,除非您可以告诉我们您希望从这些列中获得多个值中的哪一个
  • 我们能看到一些数据吗?

标签: sql-server join left-join distinct


【解决方案1】:

如果不了解您的数据,您不可能在这里选择正确的答案。

Table2 似乎每个user_id 支持多个addresses。这是一种常见的设计。如果您只想为每个 user_id 返回一个 address,您有多种选择:

  1. 修复数据 - 从表 2 中删除重复的地址并添加一个约束以防止再次出现这种情况。您需要确定哪些地址不正确。
  2. 减少左连接,使每个用户仅包含一个地址 - 如何执行此操作将取决于您的其他数据。您可以使用min()max()group by,如果您不关心在有多个的情况下返回哪一个,或者您可能需要在生效日期之前订购并取最新的一个 - 或者可能有帐单和送货地址,您应该选择正确的。
  3. 接受每个用户有多个地址 - 这可能是正确的 - 并调整其余代码。

【讨论】:

    猜你喜欢
    • 2016-10-02
    • 1970-01-01
    • 2021-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-14
    • 1970-01-01
    相关资源
    最近更新 更多