一个非常基本的问题。但是之间有什么区别
SELECT t.col
FROM table t, other_table o
WHERE t.col NOT IN o.col
和
SELECT col
FROM table
WHERE col NOT IN (SELECT col FROM other_table)
从语义上来说,这听起来与我相当,但是第一个创建了重复项。我理解错了什么?
第一个甚至不会在大多数RDBMS中运行,但是在oracle中,它将返回除where t.col
=之外的所有记录组合,o.col
如果您将其添加o.col
到自己的数据库中,则会看到此记录。SELECT
后一个查询返回的记录与中的任何记录table
都不共享该col
值other_table
。
最好的例子说明:
表格1
| ANIMAL |
|--------|
| dog |
| cat |
| horse |
表2
| ANIMAL |
|--------|
| dog |
| fish |
查询:
SELECT t."animal",o."animal"
FROM Table1 t, Table2 o
WHERE t."animal" NOT IN o."animal"
| ANIMAL | ANIMAL2 |
|--------|---------|
| cat | dog |
| horse | dog |
| dog | fish |
| cat | fish |
| horse | fish |
SELECT t."animal"
FROM Table1 t
WHERE t."animal" NOT IN (SELECT o."animal" FROM Table2 o)
| ANIMAL |
|--------|
| horse |
| cat |
演示:SQL Fiddle
基本上,您在第一个查询中具有笛卡尔乘积,该乘积将返回两个表中记录的每个组合,但是您的WHERE
条件会过滤掉其中的一个。第二个查询没有任何JOIN
隐式/显式查询,它只是从一个表中获取记录并根据碰巧从另一个表中提取的条件进行过滤。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句