潜在的递归SQL查询

潜在的递归SQL查询,sql,sql-server,recursion,Sql,Sql Server,Recursion,我有一个三级SQL表树;父母,孩子,孤儿 我希望从父项中选择一行,即父项键“ID”=3 然后选择table1 child中的所有行,其中child1键“ID1”=3,如果 孤儿表2是“ID2”列表,用作“ID1”的过滤器 我已尝试左联接: SELECT [itemName] FROM [dbo].[table] WHERE [ID] = 3 LEFT OUTER JOIN [dbo].[table1] ON [dbo].[table].[ID] = [dbo].[table1].[ID1

我有一个三级SQL表树;父母,孩子,孤儿

我希望从父项中选择一行,即父项键“ID”=3

然后选择table1 child中的所有行,其中child1键“ID1”=3,如果

孤儿表2是“ID2”列表,用作“ID1”的过滤器

我已尝试左联接:

SELECT [itemName]
FROM [dbo].[table]
WHERE [ID] = 3
LEFT OUTER JOIN [dbo].[table1]
    ON [dbo].[table].[ID] = [dbo].[table1].[ID1]
where正在破坏它,我甚至还没有接近于计算出表1的第三级过滤

这些是我的表格定义

CREATE TABLE [dbo].[table] (
    [ID]  INT NOT NULL IDENTITY(1, 1) PRIMARY KEY,
    [Company]   varchar(250)
);

CREATE TABLE [dbo].[table1] (
    [t1_fid]  INT NOT NULL IDENTITY(1, 1) PRIMARY KEY,
    [Product]   varchar(250),
    [Description]   varchar(250),
    [ID1] INT FOREIGN KEY REFERENCES [dbo].[table]([ID]) ON UPDATE CASCADE ON DELETE CASCADE
);

CREATE TABLE [dbo].[table2] (
    [t2_fid]  INT NOT NULL IDENTITY(1, 1) PRIMARY KEY,
    [someValue]  INT,
    [ID2] INT FOREIGN KEY REFERENCES [dbo].[table]([t1_fid]) ON UPDATE CASCADE ON DELETE CASCADE
);
我的桌子就是这样

table:
[ID]    [Company]
1       companyA
2       companyB
3       companyC

table1:
[t1_fid]  [Product]   [Description]   [ID1]
1         Tree        Green           3
2         House       Built           1
3         Tree        Dead            3
4         Car         White           2
5         House       Sold            3
6         Car         Crashed         3
7         Car         Sold            3

table2:
[t2_fid]    [someValue]   [ID2]
1           60            1
2           2             2
3           15            5
4           0             6
这是我想要的结果表。这是一个包含所有companyC产品的表格,该表格也存在于表2中



[Company]   [Product]   [Description]   [someValue]
companyC    Tree        Green           60
companyC    House       Sold            15
companyC    Car         Crashed         0

我希望这足够的信息

您的查询有一个基本语法错误。这:

SELECT [itemName]
FROM [dbo].[table]
WHERE [ID] = 3
LEFT OUTER JOIN [dbo].[table1]
    ON [dbo].[table].[ID] = [dbo].[table1].[ID1]
应该是这样的:

SELECT [itemName]
FROM [dbo].[table] 
LEFT OUTER JOIN [dbo].[table1]
    ON [dbo].[table].[ID] = [dbo].[table1].[ID1]
WHERE [ID] = 3

你很接近。如果我理解正确的话,我不明白为什么递归是必要的

SELECT *
FROM table tbl
INNER JOIN table1 t1
    ON tbl.ID = t1.ID1
WHERE tbl.id = 3
  AND EXISTS
        ( SELECT 1
            FROM table2 t2
           WHERE t1.t1_fid = t2.id2
        )

这是非常基本的。您希望查看所有表中的数据,并且只需要匹配项。这就是简单的内部联接所做的

SELECT
  t.company,
  t1.product,
  t1.description,
  t2.somevalue
FROM dbo.[table] t
JOIN dbo.table1 t1 ON t1.id1 = t.id
JOIN dbo.table2 t2 ON t2.id2 = t1.t1_fid
WHERE t.id = 3;

JOIN
internal JOIN
的缩写)

非常感谢,现在我如何添加我的第二级筛选?因为您只需要
table1
中的条目,其中
table2
中存在匹配条目,
table1
table2
之间的
内部联接应满足您的要求。在
WHERE
子句之前包含它,但在
左外部联接之后包含它,这在开箱即用的情况下非常有效!非常感谢。是否可以从所有三个表中只选择部分列,而不是选择*?我注意到上面没有从表2中返回任何数据。可以修改成这样吗?