一个用SQL Sever求解数独的SQL

分别从 文章1 https://axial-sql.com/info/exploring-sql-server-solving-sudoku-with-t-sql/ 和文章2 https://www.sqlservercentral.com/blogs/tsql-sudoku-ii-2 看到的代码和解释,思路还是穷举法。然后经过删减,终于能执行出来了,注释掉了不懂要怎么修改的部分,需要进一步研究。

sql 复制代码
WITH x( s, ind ) AS
( 
  SELECT CONVERT(VARCHAR(100),'53  7    6  195    98    6 8   6   34  8 3  17   2   6 6    28    419  5    8  79'), 
  CHARINDEX(' ', '53  7    6  195    98    6 8   6   34  8 3  17   2   6 6    28    419  5    8  79') AS ind
  UNION ALL
  SELECT CONVERT(VARCHAR(100), SUBSTRING(s, 1, ind - 1) + CONVERT(CHAR(1), z) + SUBSTRING(s, ind + 1, 81)),
         CHARINDEX(' ', s, ind + 1) AS ind
  FROM x
    CROSS APPLY ( VALUES(1),(2),(3),(4),(5),(6),(7),(8),(9)) z (z)
  WHERE ind > 0
  AND NOT EXISTS (
    SELECT NULL
    FROM ( VALUES(1),(2),(3),(4),(5),(6),(7),(8),(9)) ww (lp)
    WHERE z = SUBSTRING(s, (ind - 1) % 9 - 8 + lp * 9, 1)
    OR    z = SUBSTRING(s, ((ind - 1) / 9) * 9 + lp, 1)
    OR    z = SUBSTRING(s, (((ind - 1) / 3) % 3) * 3 + (((ind - 1) / 27) * 27) + lp + (((lp - 1) / 3) * 6), 1)
  )
), Sud AS (
  SELECT TOP 9 SUBSTRING(s, ROW_NUMBER() OVER (ORDER BY s) * 9 - 8, ROW_NUMBER() OVER (ORDER BY s) * 9 - (ROW_NUMBER() OVER (ORDER BY s) * 9 - 9)) AS ConcatRow
  FROM x
  CROSS APPLY ( VALUES(1),(2),(3),(4),(5),(6),(7),(8),(9)) y(N)
  WHERE ind = 0
)
, SudTable (RowCol,ConcatRow) as(
Select Row_Number() Over (Order by (Select 1)),CONVERT(VARCHAR(10), ConcatRow)
From Sud
)
select * from SudTable;
/*
SELECT c1.RowCol , [1], [2], [3], [4], [5], [6], [7], [8], [9]
FROM (
  SELECT S.RowCol,  ROW_NUMBER() OVER (PARTITION BY RowCol ORDER BY ConcatRow) as ColNo , SUBSTRING(ConcatRow, ROW_NUMBER() OVER (PARTITION BY S.RowCol ORDER BY ConcatRow), 1) as Data
  FROM SudTable S
  CROSS APPLY ( VALUES(1),(2),(3),(4),(5),(6),(7),(8),(9)) x(N)
) Intr
PIVOT (
  MAX(Data)
  FOR ColNo IN ([1], [2], [3], [4], [5], [6], [7], [8], [9])
)  AS C1
WHERE c1.RowCol = S.RowCol
ORDER BY S.RowCol ASC
*/
;
go

输出结果

复制代码
mssql@52f277ddc992:/$ /opt/mssql-tools18/bin/sqlcmd -S localhost -U sa -No -i /par/tsqlsudoku.txt -P Pass_123
RowCol               ConcatRow
-------------------- ----------
                   1 534678912
                   2 672195348
                   3 198342567
                   4 859761423
                   5 426853791
                   6 713924856
                   7 961537284
                   8 287419635
                   9 345286179

(9 rows affected)
相关推荐
广州灵眸科技有限公司9 小时前
xfce桌面触摸校准:基于灵眸科技EASY-EAl-Orin-Nano
数据库·windows·科技
憧憬成为web高手11 小时前
皮卡丘靶场速通--sql 2
数据库·sql·mybatis
段一凡-华北理工大学12 小时前
向量数据库实战:选型、调优与落地~系列文章12:文本分块策略实战:chunk_size 怎么选?重叠多少?
开发语言·数据库·后端·oracle·rust·工业智能体·高炉智能化
oradh14 小时前
Oracle XTTS实现跨版本迁移和升级(Oracle 11g单库升级至19C RAC集群)
数据库·oracle·11g升级19c·xtts跨版本迁移和升级
z1234567898615 小时前
2026最新两款AI编程工具深度对比实测
java·数据库·ai编程
程序猿DD15 小时前
一个 API Key,统一调用大模型、生图和联网搜索
数据库·网关
java_logo15 小时前
Docker Compose 部署 ClickHouse:快速搭建高性能列式数据库
数据库·clickhouse·docker·列式数据库·轩辕镜像·高性能数据库·clickhouse部署教程
TlSfoward16 小时前
抓包代理链路下的 TLS 指纹变化分析 TLSFOWARD抓包工具
数据库·爬虫·网络协议·搜索引擎·php
数智化管理手记16 小时前
账龄分析手工统计易遗漏?自动账龄分析工具怎么搭建
大数据·网络·数据库·人工智能·数据挖掘
LabVIEW开发16 小时前
NI Package Manager安装LabVIEW时InternalServerError错误
网络·数据库·labview·labview知识·labview功能·labview程序