sql - SQL - 13 个数字列的组合如何等于 1 列
问题描述
我有一个包含 14 个数字列的表。不知何故; 通过添加、减去或忽略前 13 列中的每一列,我希望组合等于第 14 列。我想找出需要添加的内容,需要减去的内容以及需要忽略的内容才能获得第 14 列。
例如,如果我有 6 列(而不是 14 列),则解决方案可能是 COLUMN1 + COLUMN2 - COLUMN3 + (0*COLUMN4) + COLUMN5
这样当我运行时:
SELECT COUNT(*) FROM TABLE
WHERE COLUMN1 + COLUMN2 - COLUMN3 + (0*COLUMN4) + COLUMN5 != COLUMN6
我得到0。
实现这一目标的最有效方法是什么?如有必要,我愿意让它运行几个小时。
我正在使用 SQL Server 2016
解决方案
这是一个全新的答案。
这个想法是取消旋转然后重新加入很多次。这是一个包含 3 列而不是 13 列的示例:
with tcols as (
select t.id, t.col14, v.which, v.col, v2.sign
from t cross apply
(values (1, t.col1), (2, t.col2), (3, t.col3)) v(which, col) cross apply
(values (-1), (1), (0)) v2(sign)
)
select *
from tcols tc1 join
tcols tc2
on tc2.id = tc1.id and tc1.which = 1 and tc2.which = 2 join
tcols tc3
on tc3.id = tc2.id and tc3.which = 3
where (tc1.sign * tc1.col) + (tc2.sign * tc2.col) + (tc3.sign * tc3.col) = tc1.col14;
显然,扩展它需要添加更多连接。
这是一个 db<>fiddle
这适用于 13 列吗?每个 id 的比较次数为 3^13 = 1,594,323。对于现代数据库来说,这很多,但可能不会超出范围。
推荐阅读
- amazon-web-services - 如何使用例如 Urllib3 从 AppSynch 查询
- javascript - 如何在内容可编辑的 div 中获取插入符号位置以使用文本和“img”标签:支持表情符号的聊天应用程序的自定义文本输入
- javascript - 为什么非空数组的长度为0
- azure - 带有 Vue 项目路由的 Azure 静态 Web 应用程序不起作用
- r - Matching 包中的这个错误是什么意思?
- c++ - ld.exe:找不到-lasan ld.exe:找不到-lubsan
- html - 如何删除由引导程序创建的这个白条?
- binary - 用于将每 2 位从二进制转换为十进制的一维字符串数组 例如:str [] = {"10 1111 1010" } => 2 33 22
- windows - EC2 快照会备份没有卷的实例吗?
- php - 在 PHP 中读取包含非英文字符的文件时出现问题