我需要检索变量=一件事的数据,并且还返回数据,该数据与另一变量相同

时间:2019-05-30 20:11:53

标签: sql

我有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

1 个答案:

答案 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),两者都将起作用。如果是这种情况,那么您将不得不求助于递归查询。