我有一个模式弹出窗口,当前包含复选框,以便管理员能够为产品添加功能。我需要更改它以便能够绑定到当前页面上的产品类别,但我的sql语句不起作用。
这里的表格是功能,类别和营销。功能使用CategoryID连接到Category(在功能和类别表中名为CategoryID),功能使用FeatureID连接到Marketing(在Marketing表中称为MarketingData)
MarketingTypeID为3告诉Marketing表查找功能并跳转到功能表。在我将Category表的内容添加到它之前,select语句有效,所以显然我编写了错误的部分。有人可以帮助我让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,Web Tutorials,CategoryID为32 ....此类别称为平台,位于类别表中。 FeatureID#23不在Marketing表中,因此不与所选产品(ProductID#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"
答案 0 :(得分:4)
如果您对此JOIN
进行比较:
FROM Feature f INNER JOIN Category c ON c.CategoryID = f.CategoryID
使用数据库结构,您将看到您正在尝试使用数据库中不存在的列(Feature.CategoryID
)。实际上,使用现有设计,您将不得不编写一个非常复杂的查询,以便从Feature
转到Category
。
但是,类别与他们可以拥有的功能之间存在更直接的关系,而这些关系尚未在数据库中显示。如果确实如此,则需要添加表CategoryFeatureLink
,然后将该表与Category
和Feature
一起用于JOIN
。
答案 1 :(得分:0)
这是我对这个问题的第二个答案,追查查询的另一个问题。
MarketingData字段是否可以为空?如果是这样,并且如果您的子查询返回NULL值,则您的语句可能无法按预期进行评估,具体取决于某些数据库设置。
理论上,这不会对两个查询产生影响,因为它们都包含相同的子查询,但如果您碰巧使用不同的@ProductID进行测试,则可能只会遇到特定产品的问题。