比较varchar字符串以产生缺少的项目列表



我有一个带有列的表。该列使用varchar作为数据类型存储位置。这些位置使用格式-2,7 -25,30

该位置从-30,-3030,30。我找不到设置循环以运行所有选项的方法。有办法做到吗?

Microsoft SQL Server 2017

;WITH cte as (
    select -30 as n --anchor member
    UNION ALL
    select n + 1  --recursive member
    from cte
    where n < 31
)
select z.* 
    from ( 
        select CONCAT(y.n,',',x.n) as locations 
        from cte as x CROSS JOIN cte y 
    ) as z
    LEFT OUTER JOIN dbo.Client as cli ON cli.client_location = z.locations
where cli.client_location IS NULL
order by z.locations asc

生成所有组合。

然后将生成的生成与现有组合匹配。

WITH DIGITS AS
(
   SELECT n FROM (VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) AS val(n)
),
NUMS AS
(
    SELECT (tens.n * 10 + ones.n)-50 AS n
    FROM DIGITS ones
    CROSS JOIN DIGITS tens
),
LOCATIONS AS
(
     SELECT CONCAT(n1.n,',',n2.n) AS location, n1.n as n1, n2.n as n2
     FROM NUMS n1
     JOIN NUMS n2 ON n2.n BETWEEN -30 AND 30
     WHERE n1.n BETWEEN -30 AND 30
)
SELECT loc.location
FROM LOCATIONS loc
LEFT JOIN
(
     SELECT Client_Location, COUNT(*) Cnt
     FROM dbo.Client 
     GROUP BY Client_Location
) cl ON cl.Client_Location = loc.location
WHERE cl.Client_Location IS NULL
ORDER BY loc.n1, loc.n2

我会选择递归CTE。这是SNR方法的略有变化:

with cte as (
      select -30 as n --anchor member
      union all
      select n + 1  --recursive member
      from cte
      where n < 30
     )
select cte.x, cte.y,
       concat(cte_x.n, ',', cte_y.n) as missing_location
from cte cte_x cross join
     cte cte_y left join
     dbo.client c
     on c.client_location = concat(cte_x.n, ',', cte_y.n) 
where c.client_location is null;

或两次避免concat()

select cte.x, cte.y, v.location as missing_location
from cte cte_x cross join
     cte cte_y cross apply
     (values (concat(cte_x.n, ',', cte_y.n))
     ) v(location) left join
     dbo.client c
     on c.client_location = v.location
where c.client_location is null;

最新更新