【问题标题】:How can I join on a table twice and reference a column name differently each time?如何两次加入表并每次引用不同的列名?
【发布时间】:2016-08-15 12:12:35
【问题描述】:

所以我有一种情况,表Partners 与名为Regions 的表具有一对一关系,并且通过名为Destinations 的交集表与同一个表存在一对多关系.下面我很好的命名约定应该可以帮助您弄清楚我的意思。

        Regions
======================
 id | name 
======================
  1 | "United States"
  2 | "Mother Russia"
  3 | "Belize"

             Partners 
=================================
 id |    name      |  region_id
=================================
  1 |  "B Obama"   |     1
  2 |  "V Putin"   |     2 


         Destinations
==============================
  partner_id  | region_id 
==============================
       1      |     2
       1      |     3 
       2      |     1
       2      |     3

我想要的是一个返回类似

的结果的查询
=======================================================
  partner_name  | partner_region  | destination_region
=======================================================
   "B Obama"    | "United States" |  "Mother Russia"
   "B Obama"    | "United States" |  "Belize"
   "V Putin"    | "Mother Russia" |  "United States"
   "V Putin"    | "Mother Russia" |  "Belize"

问题是我不知道如何在Regions 表上加入两次才能进行此查询。我知道我想要的是这样的

  SELECT Partners.name AS partner_name, 
         Regions.name AS partner_region, 
         ???          AS destination_region
  FROM 
      Partners INNER JOIN Regions ON Partners.region_id=Regions.id 
               INNER JOIN Destinations ON Partners.id=Destinations.partner_id

但我对上面的??? 填写什么感到困惑,因为Regions 已经加入Partners

【问题讨论】:

    标签: sql sql-server tsql database-design


    【解决方案1】:

    你需要另一个join

    SELECT p.name AS partner_name, 
           rd.name AS partner_region, 
           rd.name AS destination_region
    FROM Partners p INNER JOIN
         Regions rp
         ON p.region_id = rp.id INNER JOIN
         Destinations d
         ON p.id = d.partner_id INNER JOIN
         Regions rd
         ON d.region_id = rd.id;
    

    请注意,表别名使查询更易于编写和阅读。

    【讨论】:

      【解决方案2】:

      你必须 JOINRegions 两次:

      SELECT
          partner_name        = p.name,
          partner_region      = r.name,
          destination_region  = dr.name
      FROM Partners p
      INNER JOIN Regions r
          ON r.id = p.region_id
      INNER JOIN Destinations d
          INNER JOIN Regions dr
              ON dr.id = d.region_id
          ON d.partner_id = p.id
          
      

      ONLINE DEMO

      【讨论】:

        【解决方案3】:

        您需要再次从目的地添加另一个连接到区域:

         SELECT Partners.name AS partner_name, 
                 Regions.name AS partner_region, 
                 Regions2.name AS destination_region
          FROM 
              Partners INNER JOIN Regions ON Partners.region_id=Regions.id 
                       INNER JOIN Destinations ON Partners.id=Destinations.partner_id
                       INNER JOIN Regions AS Regions2 on Destinations.region_id = Regions2.id
        

        请注意,我向名为 Regions2 的 Regions 表添加了第二个别名。您需要该别名,这样您就可以明确地告诉服务器您想要哪些列(例如,Regions2.name)。

        【讨论】:

          猜你喜欢
          • 2015-04-03
          • 2022-01-12
          • 2012-05-29
          • 1970-01-01
          • 1970-01-01
          • 2012-02-27
          • 1970-01-01
          • 2016-04-22
          • 2021-12-31
          相关资源
          最近更新 更多