【问题标题】:SQL JOIN query writingSQL JOIN 查询编写
【发布时间】:2010-09-24 23:49:13
【问题描述】:

我正在尝试编写一个涉及两个表的简单查询。 “person”表有一个唯一的person_id和一个name,“friends”表有一个person_id和一个friend_id,这是person表中person_id的FK。

person:
<PK> int person_id 
varchar[45] name

friends: 
<PK> int person_id
<PK> int friend_id

我想选择人 1 的所有朋友的名字。

我可以使用IN 语句轻松做到这一点:

SELECT p.name FROM person p WHERE p.person_id IN (SELECT f.friend_id FROM friends f WHERE f.person_id = 1);

但是,我不擅长编写JOIN 语句。有人可以帮我编写等效的连接吗?

显然,这是一个人为的例子,但我已经尝试使用我的真实数据并且在概念上缺少一些东西。谢谢。

【问题讨论】:

    标签: sql join


    【解决方案1】:

    你想要这样的东西:

    SELECT p.name, f.friend_id
    FROM person AS p
    INNER JOIN friends AS f ON p.person_id = f.person_id
    WHERE p.person_id = 1
    

    这使用p.person_id = f.person_id将两个表连接在一起

    如果一个人没有朋友,你将不会得到任何行返回 - 如果你不想要这个,那么使用 LEFT JOIN,你会得到一个 NULL friend_id 的行。

    编辑:如果您想将朋友重新加入个人:

    SELECT p.name AS person_name, friend.name AS friend_name
    FROM person AS p                                         -- Our person
    INNER JOIN friends AS f ON p.person_id = f.person_id     -- the join table
    INNER JOIN person AS friend on f.friend_id = friend.id   -- Join back on person again
    WHERE p.person_id = 1
    

    也许您的应用需要像这样的 3-way join,但通常您只需要像上面那样的 2-way,或者像这样:

    SELECT p.name, f.friend_id
    FROM person AS p
    INNER JOIN friends AS f ON p.person_id = f.friend_id
    WHERE f.person_id = 1
    

    这将为您提供所有与 person_id 1 为朋友的人的姓名(但不是 person_id 1 的姓名)

    【讨论】:

      【解决方案2】:
      select 
          p.name,
          p2.name as friend_name,
      from
          person p 
          inner join friends f on p.person_id = f.person_id
          inner join person p2 on f.friend_id = p2.person_id -- friends
      where
          p.person_id = <your criteria>
      

      【讨论】:

        【解决方案3】:
        SELECT p.name FROM person p 
        INNER JOIN friends f ON f.friend_id = p.person_id
        WHERE f.person_id = 1;
        

        【讨论】:

          【解决方案4】:
          选择 p.name
          来自人 p,朋友 f
          其中 f.friend_id = p.person_id
          和 f.person_id = 1

          【讨论】:

            【解决方案5】:

            我很确定 Tony Andrews 做对了,只是我认为正确的语法是将源表放在左侧,将连接表放在右侧...

            SELECT p.name FROM person p 
            INNER JOIN friends f ON p.person_id = f.friend_id
            WHERE f.person_id = 1
            

            这将返回所有记录的[person.name] 字段,其中在[friends.friend_id] 字段中找到[person.person_id] 值并且[friends.person_id] 字段等于1....[1] 的每个朋友都会当他们连接在一起并限制为friends.person_id=[1]时,存在于已过滤的人员表中

            【讨论】:

              猜你喜欢
              • 2011-08-06
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2019-08-20
              • 2012-12-03
              • 1970-01-01
              相关资源
              最近更新 更多