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
答案 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