2011-09-23 101 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进行测试,则可能只会遇到特定产品的问题。