检查表中是否存在特定的元组

5

有没有一种方法可以在where-in语句中检查一个特定元组是否存在于表中?

类似于:

create table Test(A int, B int);

insert into Test values (3, 9);
insert into Test values (6, 7);
insert into Test values (7, 6);
insert into Test values (3, 4);

select A, B
from Test
where (B, A) in Test;

期望输出:

6|7
7|6

所以,您想检查是否有一行满足 A=6 且 B=7 吗? - nos
我想找到所有在表中反转存在的行。虽然真正的问题是你是否可以检查一个元组是否在表中,而不仅仅是列中的值。 - Acorn
如果您不介意从表中实际获取值,那么它甚至更简单:select A, B from TEST where (A=6 and B=7) or (B=6 and A=7)。如果您在(A,B)和(B,A)上拥有索引,或者至少拥有A和B列的单独索引,则此方法可以在大型表上高效运行。 - 9000
问题中的代码对我来说似乎可以工作! - meshde
3个回答

11

你非常接近了,"in"语句的第二个部分必须是一个select...所以

SELECT A,B
FROM Test
WHERE (B,A) IN (SELECT B,A FROM Test);

测试中的 (IN) 必须与同一字段(或字段类型)中。


我仍然得到以下错误:错误:第10行附近的“,”:语法错误 - Acorn
我猜测是在第二个逗号处出现了错误?尝试使用ROW(B,A)...(很抱歉我无法自行测试,我没有SQLite)... - FrankieTheKneeMan

3

Test自身连接起来,如下所示:

select t1.A, t1.B
from Test t1
join Test t2 on t1.A = t2.B and t1.B = t2.A

或者使用交集:

select A, B from Test
intersect
select B, A from Test

自我连接可能会更快。

0
当你在数据库的上下文中使用“元组”这个词时,可能会引起一些困惑的表情,因为“元组”这个词在数据库理论中也有一个正式的定义,它与你问题中暗示的集合论定义不同。
如果你试图识别不需要的元组,可以尝试以下方法:
SELECT t1.A, t1.B From Test t1 JOIN Test t2 ON t1.A=t2.B AND t1.B=t2.A WHERE t1.A > t1.B

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接