【问题标题】:SQL query to get all the data from different tables with same idSQL查询从具有相同ID的不同表中获取所有数据
【发布时间】:2017-01-29 20:37:57
【问题描述】:

对不起,如果这太简单了,但我无法解决。也不知道怎么查资料:

我有三张桌子:

提供者

id_provider  name   
---------- ----------- 
100         John 
101         Sam 
102         Peter   

联系方式

id_contact  RowNo   Email   
---------- ----------- ---------------- 
100          1      john@work.com
100          2      john@gmail.com
101          1      sam@work.com
101          2      sam@yahoo.com

产品

Id_product  RowNo   Product 
---------- ----------- ------------------------ 
100          1      John’s 1st product
100          2      John’s 2nd product
101          1      Sam’s 1st product
101          2      Sam’s 2nd product
101          3      Sam’s 3rd product

我需要一个查询来显示三个表中的所有数据,如下所示:

Id  name    id_contact  RowNo  Email     Id_Product  RowNo  Product

100  John    100         1  john@work.com    100       1   John’s 1st product
100  John    100         2  john@gmail.com   100       2   John’s 2st product
101  Sam     101         1  sam@work.com     101       1   Sam's 1st product 
101  Sam     101         2  sam@yahoo.com    101       2   Sam's 2nd product
101  Sam     null       null   null          101       3   Sam's 3rd product
102  Peter   null       null   null          null    null  null

我正在尝试所有我知道的连接,但我无法让它工作。

非常感谢

【问题讨论】:

    标签: sql-server tsql select join


    【解决方案1】:

    您可以使用以下查询:

    SELECT t1.id_provider AS Id, t1.name, 
           t2.id_contact, t2.cRowNo, t2.Email,
           t2.Id_product, t2.Product
    FROM Provider AS t1
    LEFT JOIN (
       SELECT COALESCE(id_contact, id_product) AS id,
              c.id_contact, c.RowNo AS cRowNo, c.Email,
              p.Id_product, p.Product, p.RowNo AS pRowNo
       FROM Contact AS c 
       FULL JOIN Product AS p ON p.id_product = c.id_contact AND p.RowNo = c.RowNo
    ) AS t2 ON t1.id_provider = t2.id
    

    查询在Contact 和Product 表之间执行FULL JOIN,并将派生自FULL JOIN 的表连接到Provider 表。

    FULL JOIN 是必需的,因为我们无法事先知道Contact 或Product 这两个表中的哪一个包含每个id 的最多行。

    【讨论】:

      【解决方案2】:
      select *
      from Provider P1
      left join Contact C2
      on C2.id_contact = P1.id_provider
      left join Product P2
      on P2.id_product = P1.id_provider
      

      【讨论】:

        【解决方案3】:
        SELECT  prov.*,
                c.*,
                prod.*
        FROM    PROVIDER prov
                LEFT JOIN Product prod ON prod.id_product = prov.id_provider
                LEFT JOIN Contact c ON prov.id_provider = c.id_contact
                                       AND prod.RowNo = c.RowNo
        

        使用左连接,但先将供应商加入产品,然后联系

        SQL Fiddle Demo

        【讨论】:

          猜你喜欢
          • 2017-04-23
          • 1970-01-01
          • 2015-09-02
          • 2017-04-23
          • 1970-01-01
          • 2012-08-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多