两个表中的列数不同,如何使用SQL Except Select?

3
我可以帮您翻译,以下是中文翻译结果:

我有两个SQL表格,它们都有三列。

正常

val_one, val_two, bool_val
1, 2, False
3, 4, False

Temp

val_one, val_two, bool_val
1, 2, True

我有一个SQL语句,可以选择在一个表中存在但在另一个表中不存在的所有行。

"SELECT val_one, val_two, bool_val FROM temp EXCEPT SELECT val_one, val_two, bool_val FROM normal;"

然而,这样做会有一个问题,即它还会返回具有不同布尔值的行,这不是我想要的。因此,如果查询,我只想返回具有不同(val_one,val_two)值的行。

在这个例子中,我的查询理想情况下将只返回

3, 4, False

如何修改当前语句来实现此目的?
3个回答

2

使用以下方式来使用not exists

SELECT val_one, val_two, bool_val FROM normal n
where not exists 
     (
          SELECT 1 FROM temp t  where t.val_one=n.val_one and t.val_two=n.val_two
      )

DB-Fiddle

 create table normal(val_one int, val_two int, bool_val varchar(10));
 insert into normal values(1, 2, False);
 insert into normal values(3, 4, False);

 create table temp(val_one int, val_two int, bool_val varchar(10));
 insert into temp values(1, 2, True);

查询:

 SELECT val_one, val_two, bool_val FROM normal n
 where not exists 
      (
           SELECT 1 FROM temp t  where t.val_one=n.val_one and t.val_two=n.val_two
       )

输出:

val_one val_two bool_val
3 4 false

db<fiddle 在这里


谢谢,这对我很有帮助。我不得不调整normal和temp的顺序以适应我的使用情况,但是我理解了例子。 :) - undefined
@SeanPayne 非常欢迎你。很高兴知道它有帮助。最美好的祝愿。 - undefined

0
您可以使用EXCEPT语句比较两个值val_one, val_two,然后将其与normal表连接,并返回等于val_one, val_two的值。
SELECT T2.val_one, T2.val_two, T2.bool_val FROM
(SELECT val_one, val_two FROM normal EXCEPT SELECT val_one, val_two FROM temp) T1
JOIN normal T2 ON T1.val_one = T2.val_one AND T1.val_two = T2.val_two

0

如果空值被视为不“相等”,一种方法是

SELECT val_one, val_two, bool_val 
FROM temp t
WHERE NOT EXISTS( 
              SELECT 1
              FROM normal n
              WHERE n.val_one = t.val_one AND t.val_two = n.val_two);

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