Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL-将一个查询的结果用作另一个查询的搜索条件_Sql_Sql Server - Fatal编程技术网

SQL-将一个查询的结果用作另一个查询的搜索条件

SQL-将一个查询的结果用作另一个查询的搜索条件,sql,sql-server,Sql,Sql Server,我有一个表结构,它看起来类似于下面的示例。 表1 如图所示,此表中有多个级别的记录。 我想查看的是所有有电池作为组件的东西 SELECT * FROM Table1 WHERE Component = 'Battery' 将给我所有直接作为组件的“电池”。我想要的是所有直接和间接使用电池的东西,所以上面查询结果集的所有子类别基本上都是这样 例如,机器人有一个电池。另外,XXL_红色________________________________________ 有人能告诉我怎么做吗?因为已经

我有一个表结构,它看起来类似于下面的示例。 表1

如图所示,此表中有多个级别的记录。 我想查看的是所有有电池作为组件的东西

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