如何选择3个不同的表

时间:2018-05-19 04:36:54

标签: sql inner-join

我有3张桌子:

  1. 提供商(id_provider,provider_name等)
  2. 引用(id_quote,origin,destination等)
  3. 价格(id_provider,id_quote,price)
  4. 我想在以下专栏中显示这些信息:

    origin   | destination | provider name 1 | provider name 2 | provider name 3
    q.origin | q.destin    | price(quote     |  price(quote)   |  price(quote)
    

    价格表将链接来自同一报价(航班)的多个提供商的价格。

    我希望有人可以帮助我解决这个问题。我一直尝试使用内部联接的不同方法,但我不能将提供者作为列来显示每行报价在一行中。

2 个答案:

答案 0 :(得分:1)

条件聚合适用于任何数据库:

SELECT qt.origin, qt.destination,
       MAX(CASE WHEN p.provider_name = 'provider name 1' then pr.price END) as price_1,
       MAX(CASE WHEN p.provider_name = 'provider name 2' then pr.price END) as price_2,
       MAX(CASE WHEN p.provider_name = 'provider name 3' then pr.price END) as price_3
FROM Price pr JOIN
     Quote q
     ON q.id_quote = pr.id_quote JOIN
     Provider p
     ON p.id_provider = pr.id_provider
GROUP BY q.origin, q.destination;

这还需要一个固定的提供者列表。如果您不了解列中所需的提供程序,那么您遇到需要动态SQL的问题 - 而简单的select无法完成此任务。

答案 1 :(得分:0)

在MS SQL Server(2008+)中,可以使用PIVOT。

示例:

SELECT *
FROM (
   SELECT TOP 1 WITH TIES
     qt.origin, qt.destination, prv.provider_name, prc.price
   FROM Price prc
   JOIN Quote qt ON (qt.id_quote = prc.id_quote)
   JOIN Provider prv ON (prv.id_provider = prc.id_provider)
   WHERE prv.provider_name IN 
         (
          'provider name 1',
          'provider name 2',
          'provider name 3'
         )
   ORDER BY ROW_NUMBER() OVER (PARTITION BY qt.origin, qt.destination, prv.id_provider ORDER BY qt.id_quote DESC)
) src
PIVOT  
(  
     MAX(prc.price)  
     FOR prv.provider_name IN 
         (
          [provider name 1],
          [provider name 2],
          [provider name 3]
         )
) pvt

列名称需要硬编码 但如果一个人不想对名称进行硬编码,则需要Dynamic SQL