检查表中是不是存在特定元组
Posted
技术标签:
【中文标题】检查表中是不是存在特定元组【英文标题】:Checking if specific tuple exists in table检查表中是否存在特定元组 【发布时间】:2011-12-23 06:09:50 【问题描述】:有没有办法在 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 的行? 我想找到反转表中也存在的所有行。尽管真正的问题是您是否可以检查元组是否在表中,而不仅仅是列中的值。 如果您不介意实际从表中获取值,则更简单:select A, B from TEST where (A=6 and B=7) or (B=6 and A=7)
。如果您有超过 (A,B) 和 (B,A) 的索引,或者至少有 A 和 B 列的单独索引,这将在大表上有效地工作。
问题中的代码似乎对我有用!
【参考方案1】:
你非常接近,“in”子句的后半部分必须是一个选择......所以
SELECT A,B
FROM Test
WHERE (B,A) IN (SELECT B,A FROM Test);
测试 (IN) 必须在相同的字段(或字段类型)中
【讨论】:
我仍然得到以下信息:Error: near line 10: near ",": syntax error
我猜它是扔在第二个逗号上?试试 ROW(B,A)...(很抱歉我自己无法测试,我没有 SQLite)...【参考方案2】:
当您在数据库上下文中以这种方式使用“元组”这个词时,您可能会看到一些困惑,因为“元组”这个词在数据库理论中也有一个正式的定义,它不同于隐含的集合论定义在你的问题中。
如果您尝试识别不需要的元组,您可以尝试以下方法:
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
【讨论】:
【参考方案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
不过,自加入可能会更快。
【讨论】:
以上是关于检查表中是不是存在特定元组的主要内容,如果未能解决你的问题,请参考以下文章