从具有最小值和的不同表中选择唯一记录

2024-04-26 04:02:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个带有3个表的SQLite数据库。每个表都有两列:name和value,这样所有表都有相同的记录(name),但值不同。如何选择作为跨越这些表的最小值和的一部分的记录,以便记录名是唯一的?你知道吗

姓名:史蒂文、杰米、迈克尔、乔丹、加里

价值观

(按姓名顺序排列)

表1:1、2、3、4、5

表2:2、3、1、5、6

表3:9、0、2、11、3

输出应该返回(Steven,Michael,Jamie),因为本例中的值之和等于2,这是最不可能的。你知道吗


Tags: name数据库sqlitevalue记录姓名价值观michael
2条回答

你可以试试这个

    SELECT T1.val,T2.val,T3.val FROM T1 , T2 , T3 
    WHERE T1.val <> T2.val AND T2.val <> T3.val AND T1.val <> T3.val
    GROUP BY T1.val,T2.val,T3.val,(T1.no + T2.no + T3.no)
    HAVING (T1.no + T2.no + T3.no) = 
    (SELECT MIN(T1.no)+MIN(T2.no)+MIN(T3.no)     FROM T1 , T2 , T3 
    WHERE T1.val <> T2.val AND T2.val <> T3.val AND T1.val <> T3.val)

如果有3个以上的表,只需在FROM T1 , T2 , T3, T4,..TN
之后添加表即可 并通过在where子句中添加此项来添加不相等的比较
T1.val <> T4.val AND T2.val <> T4.val AND T3.val <>T4.val对于每个表//这是为T4添加的

首先,SQL表表示无序集。因此,基于位置的两个表之间没有对应关系。相反,让我假设每个都有一个name列。你知道吗

第二,SQL并不能真正实现优化,所以您需要以一种暴力的方式来实现这一点。也就是说,生成所有组合,然后选择最小值。你知道吗

基本上使用cross join

select min(t1.value + t2.value + t3.value)
from table1 t1 cross join table2 t2 cross join table3 t3
where t1.name <> t2.name and t3.name not in (t1.name, t2.name);

或者,如果你想知道名字:

select (t1.value + t2.value + t3.value), t1.name, t2.name, t3.name
from table1 t1 cross join table2 t2 cross join table3 t3
where t1.name <> t2.name and t3.name not in (t1.name, t2.name)
order by (t1.value + t2.value + t3.value)
limit 1

相关问题 更多 >