我有3张桌子。产品,附加和链接。产品表包含原始行,然后包含更多基于原始行。然后,使用链接表将其他附加项附加到原始变体和每个变体。根据链接表,每个变体都有附加项,但原始附加有所有附加项。我需要返回变量名称为xx的所有Extras,并且输出应包括附加到原始变量和变体的所有Extras。
这些是我的桌子
产品
Id ProdName Basedonvariantid
--------------------------------------------
123 Original null
456 Product1a 123
789 Product1b 123
012 Product1c 123
987 Original null
654 Product2a 987
321 Product2b 987
098 Product2c 987
额外
Id ExtraName
--------------------------------------------
1 Extra1
2 Extra2
3 Extra3
4 Extra4
5 Extra5
6 Extra6
7 Extra7
8 Extra8
链接
Id Productid Extraid
--------------------------------------------
a 123 1
b 123 3
c 123 5
d 456 2
e 789 4
f 012 6
g 987 1
h 987 2
i 987 4
j 654 3
k 321 5
l 098 6
m 098 7
n 098 8
我无法解决。我可以进行联接,但只能将附加的附件返回到变体,即
select p.prodname, e.extraname
from Product p
join Link l on p.id=l.productid
join Extra e on e.id=l.extraid
where p.prodname in (
'Product1b',
'Product2c'
)
在前端系统中,它将显示Product1b具有与Product1和Product1b关联的所有附加功能,并且将显示Product2c具有与Product2和Product2c关联的所有附加功能。
如何编写一个查询,告诉我“将product1b和2c的所有其他功能都给我,并返回以下内容:
Prodname Extraname
--------------------------------------------
Product1b Extra1
Product1b Extra3
Product1b Extra4
Product1b Extra5
Product2c Extra1
Product2c Extra2
Product2c Extra4
Product2c Extra6
Product2c Extra7
Product2c Extra8
答案 0 :(得分:1)
您可以在OR
表的联接条件中使用link
。这可能不是最有效的(其中UNION可能更有效)
select p.prodname, e.extraname
from Product p
join Link l on (p.id=l.productid OR p.basedonvariantid = l.productid)
join Extra e on e.id=l.extraid
where p.prodname in (
'Product1b',
'Product2c'
);
UNION
版本如下:
select p.prodname, e.extraname
from Product p
join Link l on p.id=l.productid
join Extra e on e.id=l.extraid
where p.prodname in (
'Product1b',
'Product2c'
)
UNION ALL
select p.prodname, e.extraname
from Product p
join Link l on p.basedonvariantid=l.productid
join Extra e on e.id=l.extraid
where p.prodname in (
'Product1b',
'Product2c'
)
只要BasedonvariantID
从未引用另一个变体(其本身指的是主要ID),两者都将起作用。如果是这种情况,那么您将不得不求助于递归查询。