SQL 确定要保留的行和要删除的行
SQL to determine which rows to retain and which to remove
大家早上好,
我有点精神障碍,想看看是否有人可以帮助我。我有一个 table 盘点我们办公室创建的 PDF 文件。我们已经更改了命名约定,我正在尝试开发逻辑来指定何时创建具有新命名约定的 PDF 来标记旧文件,以便我可以开发批处理脚本以将它们移出文件位置。下面是一些例子。顺便说一下,每个文件在 table 中都是它自己的行。
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 存储库清洁.感谢您的帮助和鼓励。
如果您试图突出显示要删除的记录 - 并且您只想 return 旧格式的记录,同时 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;
以下应该可行,但更多样的样本数据会很有用。
以下使用可更新的 CTE 来识别 old/new 格式名称并删除旧格式,其中相同的 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)
大家早上好,
我有点精神障碍,想看看是否有人可以帮助我。我有一个 table 盘点我们办公室创建的 PDF 文件。我们已经更改了命名约定,我正在尝试开发逻辑来指定何时创建具有新命名约定的 PDF 来标记旧文件,以便我可以开发批处理脚本以将它们移出文件位置。下面是一些例子。顺便说一下,每个文件在 table 中都是它自己的行。
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 存储库清洁.感谢您的帮助和鼓励。
如果您试图突出显示要删除的记录 - 并且您只想 return 旧格式的记录,同时 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;
以下应该可行,但更多样的样本数据会很有用。
以下使用可更新的 CTE 来识别 old/new 格式名称并删除旧格式,其中相同的 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)