【问题标题】:How to left join two tables on specific conditions如何在特定条件下左连接两个表
【发布时间】:2019-10-08 12:59:30
【问题描述】:

我有两张表 Price(Type, Values) 和 Product(Seat) 以及一些值。

Price        | Product
-------------+---------
Type  Values | Seat
S     4      | FO
P     6      | CA
             | FA

我知道[FO]和[CA]属于[P]类型,[FA]属于[S]类型。如何加入这些表并显示关联的类型和值:

结果

Seat  Type  Values
----- ----- -----------
FO    P     6
CA    P     6
FA    S     4

【问题讨论】:

  • 到目前为止您尝试过什么?请不要使用链接向我们展示您的数据;在您的问题中包含详细信息为text
  • 还要指定预期的结果。看看minimal reproducible example
  • 创建另一个表来存储“我知道[FO]和[CA]属于[P]类型,[FA]属于[S]类型, " 关系。

标签: sql sql-server join left-join


【解决方案1】:

你可以join这样的表格:

select pr.seat, sum(p.value)
from price p join
     product pr
     on pr.seat in ('FO', 'CA') and p.type = 'P' or
        pr.seat in ('FA') and p.type = 'S'
group by pr.seat;

也就是说,您应该有一个合适的桌子将座位连接到产品,可能称为ProductSeats,每个产品有一排和匹配的座位。

【讨论】:

    【解决方案2】:

    我会使用派生表来存储priceseat 之间的映射。当出现新需求时,这很容易扩展。

    SELECT pri.*, pro.*
    FROM price pri
    INNER JOIN (
        SELECT 'FO' seat, 'P' price
        UNION ALL SELECT 'CA' seat, 'P' price
        UNION ALL SELECT 'FA' seat, 'S' price
    ) map ON map.pri = pri.price
    INNER JOIN product pro ON pro.seat = map.pro
    

    这可以通过使用VALUES() 语法来简化:

    SELECT pri.*, pro.*
    FROM price pri
    INNER JOIN ( 
        VALUES('FO', 'P'), ('CA', 'P'), ('FA', 'S') 
    ) AS map(seat, price) ON map.pri = pri.price
    INNER JOIN product pro ON pro.seat = map.pro
    

    【讨论】:

      猜你喜欢
      • 2019-10-05
      • 1970-01-01
      • 2015-01-12
      • 2016-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多