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
分成三个单独的列:productA
、productB
和 productC
.他们会更容易以这种方式工作。我建议您创建一个新的 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
我总共有 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
分成三个单独的列:productA
、productB
和 productC
.他们会更容易以这种方式工作。我建议您创建一个新的 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