代码之家  ›  专栏  ›  技术社区  ›  Tim Schmelter

SQL查询:自引用外键关系

  •  4
  • Tim Schmelter  · 技术社区  · 15 年前

    我有两张桌子, tabSparePart tabSparePartCategory . 每个备件都属于一个备件类别。我需要属于特定类别的所有备件。但问题是,一个备件类别可能是另一个类别的“子类别”,它们相互引用(“主类别”在FK列中有“null”)。

    假设我需要所有的备件 fiSparePartCategory=1 以及属于“子类别”的所有备件 category=1

    如何编写返回所有备件的SQL查询,而不管子类别有多少级。希望你能理解我的要求。

    下面是我的例子。如何使其动态化,使其在不考虑子类别数的情况下工作?

    谢谢,蒂姆

    alt text

    http://www.bilder-hochladen.net/files/4709-lg-jpg.html

    编辑 :以下是另一种静态方法,在只有一级子类别时有效:

    SELECT     SparePartName
    FROM         tabSparePart
    WHERE     (fiSparePartCategory IN
                   (SELECT     idSparePartCategory
                         FROM          tabSparePartCategory
                         WHERE      (idSparePartCategory = 1) OR
                                    (fiSparePartCategory = 1)))
    
    1 回复  |  直到 15 年前
        1
  •  6
  •   Ronald Wildenberg    15 年前

    你可以使用 recursive Common Table Expression 为了这个。

    WITH SparePartCategories(CategoryId) AS
    (
        SELECT c.idSparePartCategory
        FROM tabSparePartCategory c
        WHERE c.idSparePartCategory = 1
    
        UNION ALL
    
        SELECT c.idSparePartCategory
        FROM tabSparePartCategory c
        JOIN SparePartCategories parent ON c.fiSparePartCategory = parent.CategoryId
    )
    SELECT sp.SparePartName
    FROM tabSparePart sp
    JOIN SparePartCategories spc ON sp.fiSparePartCategory = spc.CategoryId