Table_1 D_ID整数 Deposit_amt整数 Table_2 Total_ID Total_amt整数
Table_1 D_ID整数 Deposit_amt整数
Table_2 Total_ID Total_amt整数
是否有可能写一个SELECT语句来找到所有的行Table_1,其Deposit_amt总和为Total_amt中Table_2。两个表中都有多个行。
Table_1
Deposit_amt
Total_amt
Table_2
假设第一行中Table_2有一个Total_amt=100。我想知道,在Table_1与行D_ID2,6,12求和= 100,行D_ID2,3,42求和= 100,等。
Total_amt=100
D_ID
帮助表示赞赏。让我知道是否需要澄清。
我问这个问题,因为某人作为工作的一部分,拥有交易清单和总计清单,她需要查找可能已创建总数的交易清单。我同意这听起来很危险,因为找到总计为一笔交易的组合并不能保证它们创建了一笔总数。
我不知道这是一个np完全问题。
只是为了好玩,我做了一个蛮力的解决方案。它将找到一个,两个或三个记录的总和Total_amt。您可以通过添加d4,子d5选择等将其扩展为处理每笔交易更多的事务:
d4
d5
begin tran create table Table_1 (D_ID int, Deposit_amt int) create table Table_2 (Total_ID int, Total_amt int) insert into Table_1 (D_ID, Deposit_amt) values (1, 4) insert into Table_1 (D_ID, Deposit_amt) values (2, 3) insert into Table_1 (D_ID, Deposit_amt) values (3, 1) insert into Table_1 (D_ID, Deposit_amt) values (4, 1) insert into Table_1 (D_ID, Deposit_amt) values (5, 9) insert into Table_1 (D_ID, Deposit_amt) values (6, 13) insert into Table_1 (D_ID, Deposit_amt) values (7, 6) insert into Table_1 (D_ID, Deposit_amt) values (8, 7) insert into Table_1 (D_ID, Deposit_amt) values (9, 12) insert into Table_1 (D_ID, Deposit_amt) values (10, 4) insert into Table_2 (Total_ID, Total_amt) values (1, 17) insert into Table_2 (Total_ID, Total_amt) values (2, 23) insert into Table_2 (Total_ID, Total_amt) values (3, 55) insert into Table_2 (Total_ID, Total_amt) values (4, 4) select t.Total_amt, d1.D_ID as d1_ID, d1.Deposit_amt as d1_amt, d2.D_ID as d2_ID, d2.Deposit_amt as d2_amt, d3.D_ID as d3_ID, d3.Deposit_amt as d3_amt from Table_2 t cross join ( select D_ID, Deposit_amt from Table_1 ) d1 inner join ( select D_ID, Deposit_amt from Table_1 union all select null, null ) d2 on d1.D_ID > d2.D_ID or d2.D_ID is null inner join ( select D_ID, Deposit_amt from Table_1 union all select null, null ) d3 on d2.D_ID > d3.D_ID or d3.D_ID is null where isnull(d1.Deposit_amt, 0) + isnull(d2.Deposit_amt, 0) + isnull(d3.Deposit_amt, 0) = t.Total_amt order by Total_amt rollback tran
输出:
Total_amt d1_ID d1_amt d2_ID d2_amt d3_ID d3_amt ----------- ----------- ----------- ----------- ----------- ----------- ----------- 4 3 1 2 3 NULL NULL 4 4 1 2 3 NULL NULL 4 1 4 NULL NULL NULL NULL 4 10 4 NULL NULL NULL NULL 17 9 12 3 1 1 4 17 9 12 4 1 1 4 17 10 4 5 9 1 4 17 8 7 7 6 1 4 17 6 13 1 4 NULL NULL 17 10 4 6 13 NULL NULL 17 10 4 8 7 7 6 17 8 7 5 9 4 1 17 10 4 9 12 4 1 17 8 7 5 9 3 1 17 10 4 9 12 3 1 17 6 13 3 1 2 3 17 6 13 4 1 2 3 23 8 7 6 13 2 3 23 6 13 5 9 3 1 23 6 13 5 9 4 1 23 10 4 7 6 6 13 23 10 4 9 12 8 7 23 7 6 6 13 1 4 23 9 12 8 7 1 4 (24 row(s) affected)
注意: 您可以过滤出其的各个行Deposit_amt > Total_amt,但是除非对其Deposit_amt进行索引,否则这可能对性能没有太大帮助。
Deposit_amt > Total_amt