【问题标题】:SQL to determine which rows to retain and which to removeSQL 确定要保留哪些行以及要删除哪些行
【发布时间】:2021-12-02 14:52:47
【问题描述】:

大家早上好,

我有点精神障碍,想看看是否有人可以帮助我。我有一张表格,用于盘点我们办公室创建的 PDF 文件。我们已经更改了命名约定,我正在尝试开发逻辑,以指定何时创建具有新命名约定的 PDF 以标记旧的,以便我可以开发一个批处理脚本将它们移出文件位置。下面是一些例子。顺便说一下,每个文件在表格中都是自己的行。

     PAR                          ORIGFILENAME

 111100000012         |          1100000012.pdf

 111100000012         |          1100000012_C_1_UB.pdf

 111100000012         |          1100000012_R_1.pdf

新的命名约定包含 _R_Number 或 _C_Number。在上面的例子中,第一个文件是旧的,我想保留第二个 2。

第二个例子有更多。以下是 5 个文件。我想保留具有新命名约定的最后两个并删除前 3 个。

    PAR                           ORIGFILENAME

 1100000076                      1100000076-2.pdf

 1100000076                      1100000076-3.pdf

 1100000076                      1100000076.pdf

 1100000076                      1100000076_C_7_BARN.pdf

 1100000076                      1100000076_R_1.pdf

如果我可以在新文件存在时键入这些旧文件,我的计划是将这些名称开发成一个批处理脚本并将其合并到一个 SSIS 包中,该包将每周运行以保持我们的 PDF 存储库清洁。我感谢任何帮助和鼓励。

【问题讨论】:

  • 大概因为您提到 SSIS,您使用的是 SQL Server,如果是这样,请适当地标记。

标签: pdf ssis row ssms charindex


【解决方案1】:

以下应该可行,尽管更多不同数量的样本数据会很有用。

以下使用可更新的 CTE 来识别旧/新格式名称并删除相同 PAR 具有新格式的旧格式

with f as (
  select *,
    case when OrigFilename like '%*_%' escape '*' then 0 else 1 end del
  from t
)
delete from f
where del=1 
  and exists (select * from f f2 where f2.par=f.par and f2.del=0)

【讨论】:

    【解决方案2】:

    如果您尝试突出显示要删除的记录 - 并且只想返回旧格式的记录,当同时存在 C_7 和 R_1 记录时,可能是这样的吗?

    ;WITH c_7_records AS (
          SELECT par
            FROM my_table
           WHERE origfilename LIKE '%_C_7_%'
    ), 
    r_1_records AS (
          SELECT par
            FROM my_table
           WHERE origfilename LIKE '%_R_1%'
    ), 
    records_to_remove AS (
          SELECT 
        DISTINCT mt.origfilename
            FROM my_table AS mt
            JOIN c_7_records AS cr ON mt.par = cr.par
            JOIN r_1_records AS rr ON mt.par = rr.par
           WHERE mt.origfilename NOT LIKE '%_C_7_%'
             AND mt.origfilename NOT LIKE '%_R_1%'
    )
    SELECT * FROM records_to_remove;
            
    

    sql fiddle

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-25
      • 2011-03-31
      • 1970-01-01
      • 2013-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多