【发布时间】:2012-01-13 12:03:21
【问题描述】:
我在 SQL 方面很无用,但我发现自己不得不为非常简单的关键词搜索编写一个存储过程。
我正在尝试对名称进行简单的选择 - 使用 %keyword%- 然后在描述上进行另一个选择 - 相同的关键字 - 并加入(联合)这 2 个选择。
但是,我得到了错误:
The ntext data type cannot be selected as DISTINCT because it is not comparable.
我尝试使用 UNION ALL,但在某些情况下会返回重复的行(取决于关键字/短语)。
我也尝试过使用临时表并在其上选择 distinct,但这就是我真正感到困惑的地方。
规则:
- 我无法更改数据类型
- 我需要“名称”上选择的行位于“描述”上选择的行上方
- 我只能使用 1 个存储过程,并且无法更改数据适配器,因为我将它插入到我无法控制的系统中。
更多信息:
表格列(我使用的重要的 2 个是名称和描述):
ProductId int
Name varchar(255)
Introduction varchar(255)
Description ntext
Material ntext
Colour varchar(255)
Active bit
Dimensions varchar(255)
Photo varchar(255)
Price decimal(10, 2)
DisplayOrder int
ProductReference varchar(255)
CategoryId int
FriendlyURL varchar(1000)
SQL:
(SELECT Products.ProductId, Name, Introduction, Description, Active,
Material, Colour, Dimensions, Photo, Price, DisplayOrder, FriendlyURL,
ProductReference, Categories_Products_Lookup.CategoryId
FROM Products INNER JOIN
Categories_Products_Lookup ON
Products.ProductId = Categories_Products_Lookup.ProductId
WHERE Active = 1 AND tProduct.Name like '%'+@Keyword+'%')
UNION
(SELECT Products.ProductId, Name, Introduction, Description, Active,
Material, Colour, Dimensions, Photo, Price, DisplayOrder, FriendlyURL,
ProductReference, Categories_Products_Lookup.CategoryId
FROM ProductsINNER JOIN
Categories_Products_Lookup ON
Products.ProductId = Categories_Products_Lookup.ProductId
WHERE Active = 1 AND Products.Description like '%'+@Keyword+'%')
非常感谢任何帮助获取不同行的表。另外,作为外行向我解释会很棒。 :)
【问题讨论】:
-
您使用的是哪个版本的 SQL Server?如果 2005+ 可以将列的数据类型更改为
nvarchar(max)?ntext已弃用且难以使用。nvarchar(max)是它的替代品。还有一个具体原因为什么您在这里使用UNION而不是or? -
嗨,马丁,我使用的是 2008 R2。但是,我认为我无法更改数据类型。它有一个完整的系统在运行,我不知道它会对其他领域产生什么连锁反应。使用 OR 会做什么?我希望从这两个选择中获得结果,但让来自“名称”的选择排在首位。
-
好吧,您发布的查询有点混乱和无效,因为一个分支在
Where中提到了tProduct,但在FROM和另一个Products中没有这样的表,但假设他们是同一张桌子。WHERE Active = 1 AND (Products.Description like '%'+@Keyword+'%') or Products.Name like '%'+@Keyword+'%')会做同样的事情,而不必扫描表并执行两次连接然后合并两个结果。 -
抱歉,是的,tProduct 和 Products 表是相同的。我在发布前稍作编辑,错过了一些更改。刚刚测试了 OR - 结果正常,但顺序错误。我希望在“名称”中带有关键字的行高于 any 其他行。似乎按 ID 顺序产生结果。
-
即使您进行了强制转换以使其正常工作,您的
UNION查询也不会发生所需的排序。
标签: sql sql-server sql-server-2008-r2