我有2个具有以下结构的表:
------------------------------------
| dbo.Katigories | dbo.Products |
|-----------------|------------------|
| product_id | product_id |
| Cat_Main_ID | other data..... |
| Cat_Sub_ID | other data..... |
| Cat_Sub_Sub_ID | other data..... |
| other data..... | other data..... |
我想检索dbo.Products
表中的所有产品,具有相同的Cat_Main_ID
和相同的Cat_Sub_ID
。为此,我有以下SELECT语句:
SELECT * FROM dbo.katigories, dbo.Products
WHERE
dbo.katigories.Cat_Main_ID = (the Cat_Main_ID – exists_in-my url - query string)
AND
dbo.katigories.Cat_Sub_ID = (the Cat_Sub_ID – exists_in-my url - query string)
AND
dbo.katigories.product_id = dbo.Products.product_id
不幸的是,这个SELECT语句给了我重复的产品记录。
我知道为什么会发生这种情况:原因是某些产品同时属于许多类别或子类别。我不知道的是我可以设法从Products
表中获取唯一的记录。只有唯一的product_id
没有重复。
有人可以帮助我查询我的查询的正确语法吗?
答案 0 :(得分:1)
在SQL Server中,您可以使用此技巧:
SELECT TOP (1) WITH TIES *
FROM dbo.katigories k JOIN
dbo.Products p
ON k.product_id = p.product_id
WHERE k.Cat_Main_ID = (the Cat_Main_ID – exists_in-my url - query string) AND
k.Cat_Sub_ID = (the Cat_Sub_ID – exists_in-my url - query string)
ORDER BY ROW_NUMBER() OVER (PARTITION BY p.product_id ORDER BY NEWID());
在其他数据库中,您可以在子查询或CTE中使用ROW_NUMBER()
执行非常类似的操作。
注意:
SELECT *
很危险,因为您的列名称相同。JOIN
语法。 从不在FROM
子句中使用逗号。答案 1 :(得分:0)
我认为您可以在指令'SELECT'
之后添加指令'DISTINCT'