首页 > 解决方案 > 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

标签: sqlsql-servertsql

解决方案


这是一个全新的答案。

这个想法是取消旋转然后重新加入很多次。这是一个包含 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。对于现代数据库来说,这很多,但可能不会超出范围。


推荐阅读