2011-09-23 152 views
2

我有一個模式彈出窗口,當前在其中包含複選框,以便管理員能夠向產品添加功能。我需要將其更改爲能夠綁定到當前頁面上的產品類別,但我的sql語句不起作用。SELECT語句問題

這裏的表格是Feature,Category和Marketing。功能通過CategoryID連接到類別(類別表中的功能&中的類別ID),功能通過功能ID連接到Marketing(在Marketing表中稱爲MarketingData)

MarketingTypeID爲3告訴Marketing表查找功能,並將跳轉到功能表。 select語句在我添加Category表格的東西之前工作,所以很明顯我編碼的那部分是錯誤的。有人能幫我讓select語句正常工作嗎?

這工作:

SELECT DISTINCT FeatureID, FeatureTitle 
FROM Feature 
WHERE FeatureID NOT IN 
(SELECT m.MarketingData FROM Marketing 
WHERE MarketingTypeID = 3 AND ProductID = @ProductID) 
ORDER BY FeatureTitle 

這不:

SELECT DISTINCT f.FeatureID, f.FeatureTitle FROM Feature f 
INNER JOIN Category c 
ON c.CategoryID = f.CategoryID 
WHERE f.CategoryID = @CategoryID 
AND f.FeatureID NOT IN 
(SELECT m.MarketingData FROM Marketing m 
WHERE m.MarketingTypeID = 3 AND m.ProductID = @ProductID) 
ORDER BY f.FeatureTitle 

enter image description here

EX: FeatureID和#23,網絡教程,有32類別ID ... 。該類別稱爲平臺,位於類別表中。 FeatureID#23不在Marketing表中,因此與所選產品(產品ID#1)無關。我需要一個複選框,表示Web教程顯示在模式中。就像我之前說過的那樣,在添加與用戶選擇的產品關聯的類別的所有信息之前,情況還是很好的。

更新:我不知道爲什麼我試圖按照我的方式編寫該聲明。我意識到這比我原先想象的要容易得多,並且改變了陳述。現在這個工作,謝謝大家的幫助!我改變了SELECT語句:

"SELECT DISTINCT f.FeatureID, f.FeatureTitle 
FROM Feature f 
LEFT JOIN Category c ON c.CategoryID = f.CategoryID 
WHERE f.CategoryID IN 
(SELECT CategoryID FROM CategoryLink 
WHERE ProductID = @ProductID) 
AND f.FeatureID NOT IN 
(SELECT m.MarketingData FROM Marketing m WHERE m.MarketingTypeID = 3 
AND m.ProductID = @ProductID) 
ORDER BY f.FeatureTitle" 
+2

定義「不起作用」。 – JNK

+0

數據庫結構的屏幕截圖是最新的嗎?我在功能表中看不到CategoryID列 –

+0

功能表中沒有此產品數據庫圖片中的類別ID字段。 – JeffM

回答

4

如果你比較這JOIN

FROM Feature f INNER JOIN Category c ON c.CategoryID = f.CategoryID 

與數據庫結構,你會發現你正在嘗試使用的列(Feature.CategoryID),其不存在於你的數據庫中。事實上,在現有的設計中,你將不得不寫一個相關的查詢來從FeatureCategory

但是,可能確實存在類別與它們可能具有的尚未在數據庫中表示的功能之間的更直接關係。如果確實如此,則需要添加一個表CategoryFeatureLink,然後在JOIN的三路上使用該表以及CategoryFeature

+0

不,這是我的錯誤,沒有將其添加到文檔中。我昨天剛剛添加了CategoryID列到Feature表,我對此表示歉意。我會更新和切換圖片。 – jlg

+0

我更新了文檔以包含最近對數據庫所做的更改。實際上添加額外的表格可能會讓它更容易,但我被告知要添加一個新的列,而不是新的表格。 – jlg

+0

在這種情況下,我懷疑數據庫中沒有滿足查詢現在相當具體要求的數據。你能否從你認爲應該由查詢返回的每個涉及表中發佈幾行數據? –

0

這是我對這個問題的第二個答案,追求與查詢不同的問題。

MarketingData字段是否爲空?如果是這樣,並且如果您的子查詢返回NULL值,則您的語句可能無法按照您的預期進行評估,具體取決於某些數據庫設置。

理論上,這兩個查詢之間沒有區別,因爲它們都包含相同的子查詢,但如果您碰巧使用不同的@ProductID進行測試,則可能只會遇到特定產品的問題。