潜在的递归SQL查询

时间:2019-07-18 16:21:34

标签: sql sql-server recursion

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

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

然后选择table1子级中的所有行,其中child1键“ ID1” = 3 IF ....

孤立子表2是“ ID2”的列表,充当“ ID1”的过滤器

我尝试了左联接:

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

哪里打破了它,我甚至还没有弄清table1的第三级过滤。

这些是我的表定义。

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

这是我想要的结果表。它是表2中也存在的所有companyC产品的表。



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

我希望有足够的信息!

3 个答案:

答案 0 :(得分:1)

您的查询存在基本语法错误。这个:

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

答案 1 :(得分:0)

您非常接近。如果我理解正确,我看不出为什么需要递归。

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
        )

答案 2 :(得分:0)

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

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;

({JOININNER JOIN的缩写。)