【问题标题】:Remove slightly different duplicates删除略有不同的重复项
【发布时间】:2022-01-12 18:39:26
【问题描述】:

目标是不显示有细微差别的重复。这是一个例子:

我想删除绿色部分

这是我目前使用的查询,但不太准确。

SELECT Package
FROM myTable
WHERE Package NOT IN (SELECT Package FROM myTable WHERE Package NOT LIKE '%_AC')

【问题讨论】:

  • 提问时,您需要提供minimal reproducible example: (1) DDL 和样本数据填充,即 CREATE 表和 INSERT T-SQL 语句。 (2) 你需要做什么,即逻辑和你的代码尝试在 T-SQL 中实现它。 (3) 期望的输出,基于上述#1 中的样本数据。 (4) 您的 SQL Server 版本 (SELECT @@version;)。全部在问题内,没有图片。
  • 值是否总是以下划线开头的值作为后缀 (_)?
  • “不太准确”是“不起作用”的新同义词?
  • _ 是单个字符的通配符。有几个选项可以告诉 SQL Server 您确实需要该字符,而不是将其用作通配符,例如 NOT LIKE '%[_]AC'docs.microsoft.com/en-us/sql/t-sql/language-elements/…
  • 根据问题指南,请不要发布代码、数据、错误消息等的图像 - 将文本复制或输入到问题中。请保留将图像用于图表或演示渲染错误,无法通过文本准确描述的事情。

标签: sql sql-server tsql


【解决方案1】:

只有您的示例数据继续,您可以尝试使用not exists 标准,例如

select * 
from t
where not exists (
    select * from t t2 
    where t.package like Concat(t2.package,'%')
    and t.package != t2.package
);

【讨论】:

    【解决方案2】:

    几个想法。如果你有一个独特的列,你可以使用NOT EXISTS

    SELECT P
    FROM dbo.YourTable YT
    WHERE NOT EXISTS (SELECT 1
                      FROM dbo.YourTable e
                      WHERE (YT.P LIKE e.P + '%'
                         OR  e.P LIKE YT.P + '%')
                        AND YT.ID != e.ID);
    

    如果没有,那么您可以使用 CTE 和窗口 COUNT

    WITH CTE AS(
        SELECT YT1.*,
               COUNT(YT1.P) OVER (PARTITION BY YT1.P) AS C
        FROM dbo.YourTable YT1
             JOIN dbo.YourTable YT2 ON YT1.P LIKE YT2.P + '%'
                                    OR YT2.P LIKE YT1.P + '%') --Will always JOIN to itself
    SELECT P
    FROM CTE
    WHERE C = 1;
    

    db<>fiddle

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-15
      • 2018-12-21
      • 1970-01-01
      • 2012-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多