SQL如何根据条件选择三张或多张表中的两张进行join?

In SQL How to choose two of three or more tables to join based on a condition?

我总共有 3 个 table,但我只对根据条件加入其中两个感兴趣。有很多关于如何使用 Case 语句的问答,但那是 table 已经定义的时候。我的情况是,根据我的情况,我可以选择一个或另一个 table。这是我的 tables:

结果:

Product Type    Product Price   Product-Related Info
A               10              A Definition
A               10              A Definition
B               15              B Definition
C               30              C Definition
C               30              C Definition
C               30              C Definition

Table A、B、C(三个 table 具有相同的模式和结构):

Table A 
[Product]   [Some info]
A           Definition of A

然后TableB、C等

价格 table 有两列:价格和产品(A、B、C)

我的困惑是,当我有一个是价格时,我不确定如何加入两个 table,但另一个可能是剩余三个中的任何一个,这取决于条件。案例陈述不起作用,因为它要求您有一个最终的 table.

按键: 我应该包含更多关于键的信息。真正的挑战是,如果 Product type 列的值是 A,我需要查询 table A,如果是 B,我需要查询 B。这是主要的挑战。

您可以左连接所有三个,然后使用 COALESCE() select non-null 一个。例如:

select
  p.*,
  coalesce(a.someinfo, b.someinfo, c.someinfo) as info
from price p
left join tablea a on a.product = p.product
left join tableb b on b.product = p.product
left join tablec c on c.product = p.product

您可以使用条件连接表。只需将条件添加到您的 Join 语句中。这是一个例子:

SELECT 
...
COALESCE(A.Price, B.Price, C.Price)
...
FROM Product P
LEFT OUTER JOIN TableA A ON A.ProductId = P.ProductId AND YourConditionA
LEFT OUTER JOIN TableB B ON B.ProductId = P.ProductId AND YourConditionB
LEFT OUTER JOIN TableC C ON C.ProductId = P.ProductId AND YourConditionC

使用 COALESCE 你可以 select 第一个非空值。

首先要做的是将 Price.product 分成三个单独的列:productAproductBproductC .他们会更容易以这种方式工作。我建议您创建一个新的 table 并将数据复制过来。 之后做三个LEFT OUTER JOIN方法就可以不花哨的进行了sql:

SELECT 
price, productA, productB, productC
FROM Prices P
LEFT OUTER JOIN TypeAProducts TA ON TA.ProductId = P.productA
LEFT OUTER JOIN TypeBProducts TB ON TB.ProductId = P.productB
LEFT OUTER JOIN TypeCProducts TC ON TC.ProductId = P.productC;

简而言之,使用外部连接的工作方式(它保留 LEFT OUTER JOIN 运算符左侧的 table)连接到所有其他三个 table一步.

虽然您可以将条件逻辑写入联接,但您可能会发现这是一个可接受的解决方案。它将节省大量 coalesce() 跨各个列的操作:

select *
from TableA a cross apply (
    select * /* better to list the columns individually */
    from TableB b
    where a.ProductType = 'X'
    union all
    select *
    from TableC c
    where a.ProductType = 'Y'
) T