【问题标题】:For Table A, Return All Values in Column X in Table B对于表 A,返回表 B 的 X 列中的所有值
【发布时间】:2020-01-21 17:52:26
【问题描述】:

我有两张表,一张是员工姓名表,176条记录。另一个是员工姓名(格式相同)及其位置(7943 行)的表(有重复)。

从this answer 我推断出我需要一个左连接才能只给我表 A 中的行。

我希望下面能给我从表 A 中返回的原始 176 行,每列都有一个来自表 B 的位置值,如果不可用,则为空白,但是它给了我 7601 行,这是我一生无法做到的我明白了:

SELECT e.[UniqueName], l.[location]
FROM [Employees] as e

left join Locations as l
on e.[UniqueName] = l.[UniqueName]

即使使用 group by(鉴于我只询问表 A 中的内容,我不确定为什么有必要这样做)即使在Employees 表中的每个名称都是唯一的,也会给出 172 行!

【问题讨论】:

    标签: sql ms-access left-join


    【解决方案1】:

    表 Locations 包含每个员工的多个位置,这就是结果中出现如此多行的原因。
    如果您只想要 1 个位置并且哪个 1 都没有关系,那么将聚合添加到您的查询中:

    SELECT e.[UniqueName], MAX(l.[location]) AS location
    FROM [Employees] as e
    LEFT JOIN Locations as l
    ON e.[UniqueName] = l.[UniqueName]
    GROUP BY e.[UniqueName]
    

    您可以使用MIN() 代替MAX()。

    【讨论】:

      【解决方案2】:

      我希望下面的内容能给我原来的 176 行 表 A,每列都有一个来自表 B 的位置值,否则 如果不可用,则为空白,但是它给了我 7601 行,我不能 为了我的一生,我明白......

      虽然left join 将始终返回连接左侧数据集中的所有记录,但查询返回的记录数将取决于两者之间可能配对的数量数据集,(对于left join)将始终大于或等于连接左侧数据集中的记录数。

      对于您的示例,请考虑以下两个数据集:

      员工

      +------------+
      | UniqueName |
      +------------+
      | Alice      |
      | Bob        |
      | Charlie    |
      +------------+
      

      地点

      +------------+----------+
      | UniqueName | Location |
      +------------+----------+
      | Alice      | London   |
      | Bob        | Berlin   |
      | Bob        | New York |
      | Bob        | Paris    |
      +------------+----------+
      

      评估查询:

      select 
          e.[uniquename], l.[location]
      from 
          [employees] as e left join locations as l 
          on e.[uniquename] = l.[uniquename]
      

      将导致记录以下列方式配对:

      因此会返回结果:

      +------------+----------+
      | uniquename | location |
      +------------+----------+
      | Alice      | London   |
      | Bob        | Berlin   |
      | Bob        | New York |
      | Bob        | Paris    |
      | Charlie    |          |
      +------------+----------+
      

      【讨论】:

        【解决方案3】:

        您可以使用相关子查询:

        SELECT e.[UniqueName],
               (SELECT TOP 1 l.[location]
                FROM locations as l
                WHERE e.[UniqueName] = l.[UniqueName]
               ) as location
        FROM [Employees] as e;
        

        注意:没有ORDER BY,所以它返回一个任意位置。

        如果location 可以与给定的UniqueName 重复,您将收到错误消息。为了解决这个问题,您可以使用聚合函数:

        SELECT e.[UniqueName],
               (SELECT MAX(l.[location])
                FROM locations as l
                WHERE e.[UniqueName] = l.[UniqueName]
               ) as location
        FROM [Employees] as e;
        

        【讨论】:

        • 嗨,戈登。以上似乎取决于两个表中存在的名称(如我所问),但经过反思,我想知道如何在表 B 上搜索表 A 中的所有名称,返回找到名称匹配的位置,但也返回位置字段为空白且未找到匹配项的行?
        • @andre1990 。 . .一点也不。如果名称不在locations 中,则子查询返回NULL。
        猜你喜欢
        • 2015-12-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-15
        • 2022-07-01
        • 2017-10-03
        相关资源
        最近更新 更多