2009-04-11 135 views
3

條目我有兩個數據庫表,分類和SuperCategories,對於庫存控制系統,我的工作:SQL查詢 - 返回行一個表中沒有在其他

分類: ID_Category,類別名稱

SuperCategories:ID_SuperCategory,類別ID,SuperCategoryID

我把類別的子類別關係到SuperCategories表。我將所有類別放入類別表中。

下面是一個例子:

 
    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 

類別ID和SuperCategoryID涉及回在類別表中的主鍵ID_Category。

我想是返回所有不屬於任何其他類別的父母類別名稱的查詢:

紅盒
藍色塑料箱
鐵罐

這相當於找到SuperCategoryID列(2,4和6)中沒有顯示ID_Category的所有值,但是我在編寫SQL時遇到了問題。

我正在使用VB6查詢Access 2000數據庫。

任何幫助表示讚賞。謝謝!

編輯:我投了大家的答案,給了我一些工作。我接受了我認爲最有啓發性的答案。再次感謝你的幫助!

回答

6

Mike Pone的答案很有效,因爲他將「SuperCategories」表中的「Categories」表作爲「LEFT OUTER JOIN」加入 - 這將從「Categories」中獲取所有條目並將列從「SuperCategories」添加到那些位置該鏈接存在 - 它不存在的地方(例如,在「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 

所以這基本上是給你的答案 - 所有行,其中ID_Super上LEFT OUTER JOIN爲NULL是那些在SuperCategories表中沒有任何條目的人。全清? :-)

Marc

2

不知道,如果語法將用於訪問工作,但像這樣的工作:

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

這項工作將在Access AFAIK中工作。 – 2009-04-11 05:30:26

+0

效率太低,無法使用子查詢。直接帶外連接以提高效率 – 2009-04-11 05:34:20

+0

謝謝。這工作! – John 2009-04-11 06:30:53

5

只包括那些不這樣做是不是超級cateogories類別。一個簡單的外連接

select CategoryName from Categories LEFT OUTER JOIN 
SuperCategories ON Categories.ID_Category =SuperCategories.SuperCategoryID 
WHERE SuperCategories.SuperCategoryID is null 
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

我總是採用外連接的方法,因爲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 
-1

我有兩個表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 
相關問題