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

时间:2009-04-11 05:12:09

标签: sql

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

分类:ID_Category,CategoryName

SuperCategories:ID_SuperCategory,CategoryID,SuperCategoryID

我将类别子类别关系放入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数据库。

感谢任何帮助。谢谢!

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

6 个答案:

答案 0 :(得分:6)

SELECT
     CAT.ID_Category,
     CAT.CategoryName
FROM
     Categories CAT
WHERE
     NOT EXISTS
     (
          SELECT
               *
          FROM
               SuperCategories SC
          WHERE
               SC.SuperCategoryID = CAT.ID_Category
     )

或者

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

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

答案 1 :(得分: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
你会得到这样的东西:

CategoryName    ID_Super
Box               1
Box               2
Red Box           NULL
Blue Box          3
Blue Plastic Box  NULL
Can               4
Tin Can           NULL

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

马克

答案 2 :(得分:5)

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

select CategoryName from Categories LEFT OUTER JOIN
SuperCategories ON Categories.ID_Category =SuperCategories.SuperCategoryID
WHERE SuperCategories.SuperCategoryID is  null

答案 3 :(得分:2)

不确定语法是否适用于Access,但这样的方法可行:

select CategoryName from Categories
where ID_Category not in (
    select SuperCategoryID 
    from SuperCategories 
)

答案 4 :(得分:1)

我总是采用外连接方法,正如marc_s建议的那样。使用OUTER JOINS时有很多功能。通常,我必须进行FULL OUTER JOIN来检查查询两侧的数据。

您还应该查看ISNULL函数,如果您正在进行查询,其中数据可以在表A或表B中,那么我将使用ISNULL函数从任一列返回值。

这是一个例子


 SELECT 
       isNull(a.[date_time],b.[date_time]) as [Time Stamp]
      ,isnull(a.[ip],b[ip]) as [Device Address]
      ,isnull(a.[total_messages],0) as [Local Messages]
      ,isnull(b.[total_messages],0) as [Remote Messages]
  FROM [Local_FW_Logs] a
FULL OUTER JOIN [Remote_FW_Logs] b 
on b.ip = a.ip

答案 5 :(得分:0)

我有两张表interface_categoryinterface_subcategory

Interface_subcategory包含SubcategoryID, CategoryID, Name(SubcategoryName)

Interface_category包含CategoryID, Name(CategoryName)

现在我想要输出CategoryID和名称(子类别名称)

我写的查询在下面,它为我工作

select ic.CategoryID, ic.Name CategoryName, ISC.SubCategoryID, ISC.Name SubCategoryName from Interface_Category IC
inner join Interface_SubCategory ISC
on ISC.CategoryID = ic.CategoryID
order by ic.CategoryID, isc.SubCategoryID
相关问题