【问题标题】:SQL LIKE returns wrong results and double rowsSQL LIKE 返回错误的结果和双行
【发布时间】:2014-08-04 09:52:25
【问题描述】:

我的查询(这给了我正确的输出)

SELECT      
   CONCAT(Category.CategoryName, ': ',Product.ProductName) AS SearchOut,
 Product.ProductID
FROM Product
    ,Category
    ,ParentCategory
    ,ProductCategory
WHERE ParentCategory.ParentCatID = Category.CategoryID
   AND Category.CategoryID = ProductCategory.CategoryID 
   AND ProductCategory.ProductID = Product.ProductID

但这将是一个搜索功能,所以我想要我的LIKE

这是我的LIKE SQL 从第一个继续

   AND Category.CategoryName LIKE '%' + @SearchString + '%'
   OR Product.ProductName LIKE '%' + @SearchString + '%'
   OR Product.Description LIKE '%' + @SearchString + '%'
   OR Product.Artnr LIKE '%' + @SearchString + '%'
   OR ParentCategory.ParentCatName LIKE '%' + @SearchString + '%'

那么查询全乱了,全错了,行数多了两倍。

就像存在的每一行或其他东西的额外行。

我也试过先在Joins里写sn-p,但是都错了。

Product 应该只在结果中出现一次,但实际上存在于多个类别中的除外,但随后您会看到,因为 categorynameproductname 被包含。

感谢您的帮助!

【问题讨论】:

标签: sql sql-server tsql stored-procedures sql-like


【解决方案1】:

这是因为您的条件缺少括号。应该是这样的:

AND (Category.CategoryName LIKE '%' + @SearchString + '%'
    OR Product.ProductName LIKE '%' + @SearchString + '%'
    OR Product.Description LIKE '%' + @SearchString + '%'
    OR Product.Artnr LIKE '%' + @SearchString + '%'
    OR ParentCategory.ParentCatName LIKE '%' + @SearchString + '%')

避免此类情况的一个好方法是切换到 ANSI 联接。这样您的连接条件就不会与过滤条件混合,从而不需要括号:

SELECT CONCAT(Category.CategoryName, ': ',Product.ProductName) AS SearchOut
     ,Product.ProductID
FROM Product
JOIN ProductCategory ON ProductCategory.ProductID = Product.ProductID
JOIN Category ON Category.CategoryID = ProductCategory.CategoryID
JOIN ParentCategory ON ParentCategory.ParentCatID = Category.CategoryID
WHERE Category.CategoryName LIKE '%' + @SearchString + '%'
   OR Product.ProductName LIKE '%' + @SearchString + '%'
   OR Product.Description LIKE '%' + @SearchString + '%'
   OR Product.Artnr LIKE '%' + @SearchString + '%'
   OR ParentCategory.ParentCatName LIKE '%' + @SearchString + '%'

【讨论】:

  • 尝试计算JOINS的顺序,现在条件不匹配。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-15
  • 1970-01-01
  • 1970-01-01
  • 2012-10-29
  • 1970-01-01
  • 2019-01-07
  • 1970-01-01
相关资源
最近更新 更多