我有一个三级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
我希望有足够的信息!
答案 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;
({JOIN
是INNER JOIN
的缩写。)