代码之家  ›  专栏  ›  技术社区  ›  Freddakos

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

  •  0
  • Freddakos  · 技术社区  · 6 年前

    我有两张表,结构如下:

     ------------------------------------
    | 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 回复  |  直到 6 年前
        1
  •  1
  •   Gordon Linoff    6 年前

    在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());
    

    在其他数据库中,您可以对 ROW_NUMBER() 在子查询或CTE中。

    笔记:

    • SELECT * 很危险,因为您有同名的列。
    • 总是 使用正确、恰当、标准、明确 JOIN 语法。 从未 在中使用逗号 FROM 条款。
    • 表别名使查询更易于写入和读取。
        2
  •  0
  •   Lexahen    6 年前

    我认为您可以在“select”指令后添加“distinct”指令