获得多个喜欢的独特记录

时间:2014-08-29 09:08:03

标签: sql sql-server tsql

select Distinct 
p.ProductID,
p.SingleAppPrice,
p.ImageURL,
p.IconURL,
p.ProductName,
p.ActPrice,
c.CategoryIcon,
c.CategoryName,
s.SubCategoryName,
p.Rating,
p.AuthorID 
from 
ProductMast p,CategoryMast c,SubCategoryMast s 
where 
c.CategoryID=p.CategoryID 
and s.SubCategoryID=p.SubCategoryID 
and p.Keywords like '%application%' 
or p.ProductName like '%application%' 
or c.CategoryName like '%application%' 
or s.SubCategoryName like '%application%'

当我开火这个查询我得到121记录因为多次使用喜欢,如何防止这种重复。总记录为11

3 个答案:

答案 0 :(得分:1)

您的from子句会在三个表之间生成笛卡尔积。因此,所有表的所有记录都相互组合。这就是导致记录多于总数的原因。

而是将join这些列放在父表主键的外键上。

SELECT DISTINCT p.productid, 
                p.singleappprice, 
                p.imageurl, 
                p.iconurl, 
                p.productname, 
                p.actprice, 
                c.categoryicon, 
                c.categoryname, 
                s.subcategoryname, 
                p.rating, 
                p.authorid 
FROM   Productmast p 
       INNER JOIN Categorymast c 
               ON p.categoryid = c.categoryid 
       LEFT OUTER JOIN Subcategorymast s 
                    ON p.subcategoryid = s.subcategoryid 
WHERE  p.productname LIKE '%application%' 
        OR c.categoryname LIKE '%application%' 
        OR s.subcategoryname LIKE '%application%' 

我不确定你是否需要Distict。我想这是多余的。

答案 1 :(得分:1)

您的AND和OR子句存在优先顺序问题。

你的表加入可能还有问题,但我无法回答这个问题

这里

c.CategoryID=p.CategoryID 
and s.SubCategoryID=p.SubCategoryID

反正。

最小修正将是

select Distinct 
 p.ProductID,
 p.SingleAppPrice,
 p.ImageURL,
 p.IconURL,
 p.ProductName,
 p.ActPrice,
 c.CategoryIcon,
 c.CategoryName,
 s.SubCategoryName,
 p.Rating,
 p.AuthorID 
from 
 ProductMast p,CategoryMast c,SubCategoryMast s 
where 
 c.CategoryID=p.CategoryID 
 and s.SubCategoryID=p.SubCategoryID 
 and (p.Keywords like '%application%' 
      or p.ProductName like '%application%' 
      or c.CategoryName like '%application%' 
      or s.SubCategoryName like '%application%')

现在,当然,使用join子句的良好语法是

select Distinct 
   p.ProductID,
   p.SingleAppPrice,
   p.ImageURL,
   p.IconURL,
   p.ProductName,
   p.ActPrice,
   c.CategoryIcon,
   c.CategoryName,
   s.SubCategoryName,
   p.Rating,
   p.AuthorID 
from 
 ProductMast p,
 join CategoryMast c on c.CategoryID = p.CategoryId 
 join SubCategoryMast s on s.SubCategoryID = p.SubCategoryID
where 
 (p.Keywords like '%application%' 
 or p.ProductName like '%application%' 
 or c.CategoryName like '%application%' 
 or s.SubCategoryName like '%application%')

答案 2 :(得分:0)

尝试以下代码

WITH TempUsers (FirstName,LastName, duplicateRecordCount)
AS
(
SELECT FirstName,LastName,
ROW_NUMBER()OVER(PARTITIONBY FirstName, LastName ORDERBY FirstName) AS duplicateRecordCount
FROM dbo.Users
)
DELETE
FROM TempUsers
WHERE duplicateRecordCount > 1
GO