【问题标题】:How do I remove duplicates in paging如何在分页中删除重复项
【发布时间】:2012-04-17 07:35:20
【问题描述】:

表 1 和表 2:

table1 & table2 http://aftabfarda.parsfile.com/1.png

SELECT     *
FROM         (SELECT DISTINCT dbo.tb1.ID, dbo.tb1.name, ROW_NUMBER() OVER (ORDER BY tb1.id DESC) AS row
FROM         dbo.tb1 INNER JOIN
                      dbo.tb2 ON dbo.tb1.ID = dbo.tb2.id_tb1) AS a
WHERE     row BETWEEN 1 AND 7
ORDER BY id DESC

结果:

Result... http://aftabfarda.parsfile.com/3.png

(id 11 重复 3 次)

我怎样才能得到这个输出:

ID  name    row
--  ------  ---
11  user11  1
10  user10  2
9   user9   3
8   user8   4
7   user7   5
6   user6   6
5   user5   7

【问题讨论】:

  • 你的截图中是tb2的全部吗?
  • 是的,截图 tb1 和 tb2 在link
  • 在这种情况下 user11 永远不应该返回,因为tb2中没有相应的记录
  • 一个建议,如果您只使用这些数据,您可以在第一个表 [idGroup] 中创建一个列,并在第二个表中只有 id 和 group(在这种情况下只有 2 个条目),然后保存空间和问题:) +1 信息/图片
  • table2 是link

标签: sql sql-server sql-server-2005


【解决方案1】:

您可以使用子查询在row_number 之前应用distinct

select  *
from    (
        select  row_number() over (order by tbl.id desc) as row
        ,       *
        from    (
                select  distinct t1.ID
                ,       tb1.name
                from    dbo.tb1 as t1
                join    dbo.tb2 as t2
                on      t1.ID = t2.id_tb1
                ) as sub_dist
        ) as sub_with_rn
where   row between 1 and 7

【讨论】:

  • 无法绑定多部分标识符“tb1.id”。
  • 为表格添加别名,有帮助吗?
  • select * from ( select *,row_number() over (order by id desc) as row from ( select distinct tb1.ID , tb1.name from dbo.tb1 join dbo.tb2 on dbo.tb1 .ID = dbo.tb2.id_tb1 )as sub_t1) as sub_t2 where row 在 1 和 7 之间
【解决方案2】:

除了@Andomar's suggestion,您可以使用DENSE_RANK 代替ROW_NUMBER 并首先对行进行排名(在子查询中),然后 应用DISTINCT(在外部查询中):

SELECT DISTINCT
  ID,
  name,
  row
FROM (
  SELECT
    t1.ID,
    t1.name,
    DENSE_RANK() OVER (ORDER BY t1.ID DESC) AS row
  FROM dbo.tb1 t1
    INNER JOIN dbo.tb2 t2 ON t1.ID = t2.id_tb1
) AS a
WHERE row BETWEEN 1 AND 7
ORDER BY ID DESC

类似,但不完全相同,尽管两者可能归结为相同的查询计划,但我不确定。我认为值得测试。

当然,您也可以尝试使用 semi-join 代替正确的 join,以 INEXISTS 的形式,首先防止重复:

SELECT
  ID,
  name,
  row
FROM (
  SELECT
    ID,
    name,
    ROW_NUMBER() OVER (ORDER BY ID DESC) AS row
  FROM dbo.tb1
  WHERE ID IN (SELECT id_tb1 FROM dbo.tb2)
  /* Or:
  WHERE EXISTS (
    SELECT *
    FROM dbo.tb2
    WHERE id_tb1 = dbo.tb1.ID
  )
  */
) AS a
WHERE row BETWEEN 1 AND 7
ORDER BY ID DESC

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-08
    • 2020-12-11
    • 1970-01-01
    • 1970-01-01
    • 2017-09-16
    • 1970-01-01
    • 1970-01-01
    • 2022-12-18
    相关资源
    最近更新 更多