【问题标题】: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 列的单独索引,这将在大表上有效地工作。
  • 问题中的代码似乎对我有用!

标签: sql sqlite tuples where-in


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

    不过,自加入可能会更快。

    【讨论】:

      猜你喜欢
      • 2022-01-05
      • 1970-01-01
      • 2013-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-16
      • 2010-12-20
      • 1970-01-01
      相关资源
      最近更新 更多