SELECT语句问题
我有一个模式弹出窗口,当前在其中包含复选框,以便管理员能够向产品添加功能。我需要将其更改为能够绑定到当前页面上的产品类别,但我的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
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"
如果你比较这JOIN
:
FROM Feature f INNER JOIN Category c ON c.CategoryID = f.CategoryID
与数据库结构,你会发现你正在尝试使用的列(Feature.CategoryID
),其不存在于你的数据库中。事实上,在现有的设计中,你将不得不写一个相关的查询来从Feature
到Category
。
但是,可能确实存在类别与它们可能具有的尚未在数据库中表示的功能之间的更直接关系。如果确实如此,则需要添加一个表CategoryFeatureLink
,然后在JOIN
的三路上使用该表以及Category
和Feature
。
这是我对这个问题的第二个答案,追求与查询不同的问题。
MarketingData字段是否为空?如果是这样,并且如果您的子查询返回NULL值,则您的语句可能无法按照您的预期进行评估,具体取决于某些数据库设置。
理论上,这两个查询之间没有区别,因为它们都包含相同的子查询,但如果您碰巧使用不同的@ProductID进行测试,则可能只会遇到特定产品的问题。
定义“不起作用”。 – JNK
数据库结构的屏幕截图是最新的吗?我在功能表中看不到CategoryID列 –
功能表中没有此产品数据库图片中的类别ID字段。 – JeffM