2011-10-04 74 views
0

我是SQL中的Noob。SQL簡單內部加入

伊夫3表:

TB_ITEM 
{ 
    TB_ITEM_ID int primary key, 
    TB_ITEM_CAT_ID int, 
    TB_ITEM_SUBCAT_ID int, 
    TB_ITEM_NAME varchar(350) 
    add constraint FK_ITEM_CAT foreign key(TB_ITEM_CAT_ID) 
    references TB_ITEM_CAT(TB_ITEM_CAT_ID), 
    add constraint FK_ITEM_SUBCAT foreign key(TB_ITEM_SUBCAT_ID) 
    references TB_ITEM_SUBCAT(TB_ITEM_SUBCAT_ID) 
} 
TB_ITEM_CAT 
{ 
    TB_ITEM_CAT_ID int primary key, 
    TB_ITEM_CAT_NAME varchar(350) 
} 
TB_ITEM_SUBCAT 
{ 
    TB_ITEM_SUBCAT_ID int primary key, 
    TB_ITEM_CAT_ID int, 
    TB_ITEM_SUBCAT_NAME 
    add constraint FK_CAT foreign key(TB_ITEM_CAT_ID) 
    references TB_ITEM_CAT(TB_ITEM_CAT_ID) 
} 

TABLE 「TB_ITEM」 HAS 416個記錄。

我用盡,請查詢:

select a.TB_ITEM_NAME, b.TB_ITEM_CAT_NAME, c.TB_ITEM_SUBCAT_NAME from 
TB_ITEM a inner join 
TB_ITEM_CAT b on a.TB_ITEM_CAT_ID = b.TB_ITEM_CAT_ID 
    inner join TB_ITEM_SUBCAT c 
on a.TB_ITEM_SUBCAT_ID = c.TB_ITEM_SUBCAT_ID 

和結果是:1162個結果

我的意思是:我只想檢索從TB_ITEM那些416點的記錄及其類別名字和子目錄名稱 來自TB_ITEM_CAT和TB_ITEM_SUBCAT

此查詢是錯誤的嗎?爲什麼1162記錄只代替416?

任何意識?

+0

如果'TB_ITEM'有多行'TB_ITEM_SUBCAT_ID'具有相同的條目,那麼它們將與'TB_ITEM_SUBCAT_NAME'中的相同名稱的列匹配多次。乍一看,這可能是問題。 – 2011-10-04 21:36:55

+0

嘗試在查詢結尾添加一個由1,2,3組組成的組。問題可能是你有重複的行。 – 2011-10-04 21:43:22

+0

與分組,結果計數是1152. -10 – ozsenegal

回答

2

您需要確保TB_ITEM_SUBCAT正確連接,以避免重複

見,如果這個工程:

select a.TB_ITEM_NAME, b.TB_ITEM_CAT_NAME, c.TB_ITEM_SUBCAT_NAME from 
TB_ITEM a inner join 
TB_ITEM_CAT b on a.TB_ITEM_CAT_ID = b.TB_ITEM_CAT_ID 
inner join TB_ITEM_SUBCAT c 
on a.TB_ITEM_SUBCAT_ID = c.TB_ITEM_SUBCAT_ID and a.TB_ITEM_CAT_ID = c.TB_ITEM_CAT_ID 
+0

哇!現在可行!我的意思是,問題是什麼?你能解釋一下嗎? – ozsenegal

+0

我注意到TB_ITEM_SUBCAT表有一個TB_ITEM_CAT表的外鍵,這讓我懷疑TB_ITEM_SUBCAT_ID可能不是表的主鍵。主鍵可能是TB_ITEM_CAT_ID和TB_ITEM_SUBCAT_ID的組合。所以來自TB_ITEM的連接應該檢查兩個列的相等性。您可以通過查看TB_ITEM_SUBCAT表中的數據來驗證這一點。 –

3

TB_ITEM有兩個FKS

add constraint FK_ITEM_CAT foreign key(TB_ITEM_CAT_ID) 
    references TB_ITEM_CAT(TB_ITEM_CAT_ID) 

add constraint FK_ITEM_SUBCAT foreign key(TB_ITEM_SUBCAT_ID) 
    references TB_ITEM_SUBCAT(TB_ITEM_SUBCAT_ID) 

而且你加入比賽

from 
TB_ITEM a inner join 
inner join TB_ITEM_CAT b 
on a.TB_ITEM_CAT_ID = b.TB_ITEM_CAT_ID 

inner join TB_ITEM_SUBCAT c 
on a.TB_ITEM_SUBCAT_ID = c.TB_ITEM_SUBCAT_ID 

這意味着您的查詢rowcount必須小於或等於表計數。

因此,這讓下面的possiblities ...

  1. 你的表的計數不正確
  2. 的加入在查詢中張貼不匹配,你想什麼
  3. 您的聯合中還有其他的東西,我們沒有看到
  4. 您並未引用您認爲自己的對象。 (也許是一個視圖或同義詞)
  5. 或者你的主鍵或外鍵不是你說的那些。例如您的密鑰是複合密鑰

嘗試將模式名稱(例如dbo.TB_ITEM)添加到from子句中的表中並重新檢查其他表。

+0

不,我不這麼認爲。下面的答案適用於我 – ozsenegal

+0

我很高興你解決了你的問題。我更新了我的答案,以包括你發佈關於密鑰的其他可能性不準確(Rajeev能夠找出答案)。我留下這個答案的可能性,這可能有助於未來的人。此外,由於職位可能發生變化,您可能希望參考海報而不是「上面」或「下面」的答案。 –

1

發生了什麼事情是在結果中它創建一個記錄每次一個項目匹配一個類別/子類別。例如,如果項目A有3個類別,則結果將包括項目A的3個實例,並匹配每個類別。當然,這是由子類別表和複合,以及。如果一個項目有3個類別和2個子類別將返回6個結果!

如果你不關心哪個類別和/或子類別您選擇一個特定的項目你可以做這樣的事情:

select a.TB_ITEM_NAME, b.TB_ITEM_CAT_NAME, c.TB_ITEM_SUBCAT_NAME from 
TB_ITEM a inner join 
TB_ITEM_CAT b on a.TB_ITEM_CAT_ID = b.TB_ITEM_CAT_ID 
    inner join TB_ITEM_SUBCAT c 
on a.TB_ITEM_SUBCAT_ID = c.TB_ITEM_SUBCAT_ID 
GROUP BY a.TB_ITEM_ID 

此外,如果你只是想每一個單個實例項目和逗號分隔的類別列表,子類,我覺得這樣的事情應該工作:

select a.TB_ITEM_NAME, GROUP_CONCAT(b.TB_ITEM_CAT_NAME), GROUP_CONCAT(c.TB_ITEM_SUBCAT_NAME) from 
TB_ITEM a inner join 
TB_ITEM_CAT b on a.TB_ITEM_CAT_ID = b.TB_ITEM_CAT_ID 
    inner join TB_ITEM_SUBCAT c 
on a.TB_ITEM_SUBCAT_ID = c.TB_ITEM_SUBCAT_ID 
GROUP BY a.TB_ITEM_ID 

我希望這可以幫助你理解!