潜在的递归SQL查询
我有一个三级SQL表树;父母,孩子,孤儿 我希望从父项中选择一行,即父项键“ID”=3 然后选择table1 child中的所有行,其中child1键“ID1”=3,如果 孤儿表2是“ID2”列表,用作“ID1”的过滤器 我已尝试左联接:潜在的递归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
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中返回任何数据。可以修改成这样吗?