SQL-将一个查询的结果用作另一个查询的搜索条件
我有一个表结构,它看起来类似于下面的示例。 表1 如图所示,此表中有多个级别的记录。 我想查看的是所有有电池作为组件的东西SQL-将一个查询的结果用作另一个查询的搜索条件,sql,sql-server,Sql,Sql Server,我有一个表结构,它看起来类似于下面的示例。 表1 如图所示,此表中有多个级别的记录。 我想查看的是所有有电池作为组件的东西 SELECT * FROM Table1 WHERE Component = 'Battery' 将给我所有直接作为组件的“电池”。我想要的是所有直接和间接使用电池的东西,所以上面查询结果集的所有子类别基本上都是这样 例如,机器人有一个电池。另外,XXL_红色________________________________________ 有人能告诉我怎么做吗?因为已经
SELECT * FROM Table1 WHERE Component = 'Battery'
将给我所有直接作为组件的“电池”。我想要的是所有直接和间接使用电池的东西,所以上面查询结果集的所有子类别基本上都是这样
例如,机器人有一个电池。另外,XXL_红色________________________________________
有人能告诉我怎么做吗?因为已经有人在评论中写道,你的表格很难阅读 如果我理解正确,你的目标是计算关系的传递闭包。这是。 所有的b都是这样的,ra,b。但也包括存在c的所有b s.t.,ra,c,rc,b 这在标准SQL中是无法解决的 但是,此线程可能对sql server有所帮助。
对于博士后来说如果我没弄错的话,也许这对你有用:
SELECT *
FROM Table1 T1
WHERE Component = 'Battery'
OR EXISTS (
SELECT NULL
FROM Table1 T
WHERE Component = 'Battery'
AND T.Item = T1.Component
)
编辑
要搜索多个级别,请尝试以下操作:
DECLARE @Table1 TABLE (Component VARCHAR(255), Item VARCHAR(255))
INSERT @Table1
( Component, Item )
VALUES ('Screen','Monitor')
, ('Monitor','LED')
, ('Monitor','LCD')
, ('Monitor','CRT')
, ('Battery','Vehicle')
, ('Vehicle','Car')
, ('Car','Green_Car')
, ('Car','Red_Car')
, ('Red_Car','A_Red_Car')
, ('Red_Car','B_Red_Car')
, ('Red_Car','C_Red_Car')
, ('Car','Blue_Car')
, ('Blue_Car','X_Blue_Car')
, ('Vehicle','Van')
, ('Van','4D_Van')
, ('Van','6D_Van')
, ('6D_Van','White_6D_Van')
, ('6D_Van','Black_6D_Van')
, ('Van','8D_Van')
, ('Vehicle','Bus')
, ('Bus','HR_Bus')
, ('HR_Bus','XL_HR_Bus')
, ('HR_Bus','XXL_HR_Bus')
, ('Bus','LR_Bus')
, ('LR_Bus','White_LR_Bus')
, ('Vehicle','Train')
, ('Train','S_Train')
, ('Train','L_Train')
, ('Train','XL_Train')
, ('XL_Train','F_XL_Train')
, ('Battery','Toy')
, ('Toy','Doll')
, ('Toy','Robot')
, ('Robot','Talking_Robot')
, ('Robot','Walking_Robot')
, ('Robot','FO_Robot')
, ('FO_Robot','Red_FO_Robot')
, ('Red_FO_Robot','M_Red_FO_Robot')
, ('Red_FO_Robot','XXL_Red_FO_Robot')
, ('FO_Robot','Yellow_FO_Robot')
, ('Yellow_FO_Robot','M_Yellow_FO_Robot')
, ('Yellow_FO_Robot','XL_Yellow_FO_Robot')
, ('Toy','TeddyBear')
, ('TeddyBear','Talking_TeddyBear')
, ('TeddyBear','Walking_TeddyBear')
, ('Battery','ElectricalItem')
, ('ElectricalItem','Radio')
, ('ElectricalItem','RemoteController')
, ('RemoteController','TV')
, ('RemoteController','Audio')
, ('RemoteController','Box')
, ('ElectricalItem','Fan')
, ('Box','Shoes')
, ('Box','Computer')
;
WITH CTE AS
(
SELECT T.Component
, T.Item
FROM @Table1 AS T
WHERE T.Component = 'Battery'
UNION ALL
SELECT T.Component
, T.Item
FROM @Table1 AS T
INNER JOIN CTE
ON T.Component = CTE.Item
)
SELECT * FROM CTE
结果:
Component Item
Battery Vehicle
Battery Toy
Battery ElectricalItem
ElectricalItem Radio
ElectricalItem RemoteController
ElectricalItem Fan
RemoteController TV
RemoteController Audio
RemoteController Box
Box Shoes
Box Computer
Toy Doll
Toy Robot
Toy TeddyBear
TeddyBear Talking_TeddyBear
TeddyBear Walking_TeddyBear
Robot Talking_Robot
Robot Walking_Robot
Robot FO_Robot
FO_Robot Red_FO_Robot
FO_Robot Yellow_FO_Robot
Yellow_FO_Robot M_Yellow_FO_Robot
Yellow_FO_Robot XL_Yellow_FO_Robot
Red_FO_Robot M_Red_FO_Robot
Red_FO_Robot XXL_Red_FO_Robot
Vehicle Car
Vehicle Van
Vehicle Bus
Vehicle Train
Train S_Train
Train L_Train
Train XL_Train
XL_Train F_XL_Train
Bus HR_Bus
Bus LR_Bus
LR_Bus White_LR_Bus
HR_Bus XL_HR_Bus
HR_Bus XXL_HR_Bus
Van 4D_Van
Van 6D_Van
Van 8D_Van
6D_Van White_6D_Van
6D_Van Black_6D_Van
Car Green_Car
Car Red_Car
Car Blue_Car
Blue_Car X_Blue_Car
Red_Car A_Red_Car
Red_Car B_Red_Car
Red_Car C_Red_Car
您可以看到任何组件电池、机器人等的层次结构
WITH MyCTE
AS
(
SELECT Component, Item
FROM Table1
WHERE Component = 'Robot'
UNION ALL
SELECT Table1.Component, Table1.Item
FROM Table1
INNER JOIN MyCTE ON Table1.Component = MyCTE.Item
WHERE Table1.Component <> 'Robot'
)
SELECT * FROM MyCTE
请编辑您的表格,结构完全无法实现此解决方案只允许深度为2的解决方案。但是关于车辆,火车,火车,火车,火车,火车。@CAFEBABE,没错,没有想到多层次。为了更深入的了解,可能需要递归CTE…@SanjayaWeerakkody,这就是你想要的吗?你好。这确实在一定程度上给了我想要的,但是it@SanjayaWeerakkody,但它是什么?
WITH MyCTE
AS
(
SELECT Component, Item
FROM Table1
WHERE Component = 'Robot'
UNION ALL
SELECT Table1.Component, Table1.Item
FROM Table1
INNER JOIN MyCTE ON Table1.Component = MyCTE.Item
WHERE Table1.Component <> 'Robot'
)
SELECT * FROM MyCTE