【问题标题】:Potential Recursive SQL Query潜在的递归 SQL 查询
【发布时间】:2019-07-18 16:21:34
【问题描述】:

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

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

然后选择table1 child where child1 key "ID1"=3 IF....中的所有行

Orphan child table2 是“ID2”的列表,充当“ID1”的过滤器

我尝试了左连接:

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

哪里出了问题,我什至还没有弄清楚 table1 的第 3 级过滤。

这些是我的表定义。

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产品的表格,也存在于table2中。



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

我希望有足够的信息!

【问题讨论】:

    标签: sql sql-server recursion


    【解决方案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
    

    【讨论】:

    • 非常感谢,现在如何添加我的二级过滤?
    • 因为您只需要来自table1 的条目,其中table2 中存在匹配条目,而table1table2 之间的INNER JOIN 应该可以满足您的需求。将其包含在 WHERE 子句之前但在 LEFT OUTER JOIN 之后
    【解决方案2】:

    你已经很接近了。不过,如果我理解正确的话,我不明白为什么需要递归。

    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 *,是否可以从所有三个表中仅选择部分列?我注意到上面没有从 table2 返回任何数据。可以这样修改吗?
    【解决方案3】:

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

    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 的缩写。)

    【讨论】:

      猜你喜欢
      • 2023-03-22
      • 1970-01-01
      • 1970-01-01
      • 2020-11-27
      • 2015-07-13
      • 2014-12-19
      • 2012-12-05
      • 2016-01-25
      • 1970-01-01
      相关资源
      最近更新 更多