对两个表的SQL查询 - 返回一个表中没有另一个表的行

Joh*_*ohn 3 sql

我有两个数据库表,Categories和SuperCategories,用于我正在研究的库存控制系统:

类别:ID_Category,CategoryName

超类别:ID_SuperCategory,CategoryID,SuperCategoryID

我将category-subcategory关系放入SuperCategories表中.我将所有类别放入Categories表中.

这是一个例子:

    Categories:
    ID_Category CategoryName
    1           Box
    2           Red Box
    3           Blue Box
    4           Blue Plastic Box
    5           Can
    6           Tin Can  
    
    SuperCategories:
    ID_Super CategoryID SuperCategoryID
    1        2          1
    2        3          1
    3        4          3
    4        6          5

CategoryID和SuperCategoryID与Categories表中的主键ID_Category相关.

我想要的是一个返回所有不是任何其他类别的父类别的类别名称的查询:

红盒
蓝色塑料盒
锡罐

这相当于查找未显示在SuperCategoryID列(2,4和6)中的所有ID_Category值,但我在编写SQL时遇到问题.

我正在使用VB6来查询Access 2000数据库.

任何帮助表示赞赏.谢谢!

编辑:我投了大家的答案给了我一些有用的东西.我接受了我觉得最有启发性的答案.再次感谢你的帮助!

Tom*_*m H 6

SELECT
     CAT.ID_Category,
     CAT.CategoryName
FROM
     Categories CAT
WHERE
     NOT EXISTS
     (
          SELECT
               *
          FROM
               SuperCategories SC
          WHERE
               SC.SuperCategoryID = CAT.ID_Category
     )
Run Code Online (Sandbox Code Playgroud)

要么

SELECT
     CAT.ID_Category,
     CAT.CategoryName
FROM
     Categories CAT
LEFT OUTER JOIN SuperCategories SC ON
     SC.SuperCategoryID = CAT.ID_Category
WHERE
     SC.ID_Super IS NULL
Run Code Online (Sandbox Code Playgroud)

我还会建议您的命名标准可能会使用一些工作.他们似乎到处都是,很难合作.


mar*_*c_s 6

Mike Pone的回答是有效的,因为他将"类别"表与"超级类别"表连接为"左外部联接" - 这将从"类别"中获取所有条目,并将"超级类别"中的列添加到链接所在的列 - 在它不存在的地方(例如"SuperCategories"中没有条目),你会得到SuperCategories列的NULL - 这正是Mike的查询然后检查的.

如果你这样编写查询:

SELECT c.CategoryName, s.ID_Super 
FROM Categories c 
LEFT OUTER JOIN SuperCategories s ON c.ID_Category = s.SuperCategoryID
Run Code Online (Sandbox Code Playgroud)

你会得到这样的东西:

CategoryName    ID_Super
Box               1
Box               2
Red Box           NULL
Blue Box          3
Blue Plastic Box  NULL
Can               4
Tin Can           NULL
Run Code Online (Sandbox Code Playgroud)

所以这基本上给出了你的答案 - LEFT OUTER JOIN上的ID_Super为NULL的所有行都是那些在SuperCategories表中没有任何条目的行.全清?:-)


Mik*_*one 5

仅包括那些不是超级类别的类别.一个简单的外连接

select CategoryName from Categories LEFT OUTER JOIN
SuperCategories ON Categories.ID_Category =SuperCategories.SuperCategoryID
WHERE SuperCategories.SuperCategoryID is  null
Run Code Online (Sandbox Code Playgroud)