试图避免查询中的重复记录

时间:2018-05-28 11:42:30

标签: sql sql-server sql-server-2016

我有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没有重复。

有人可以帮助我查询我的查询的正确语法吗?

2 个答案:

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