我想知道是否存在任何快捷方式来指定IN
必须检查匹配项的列。
示例:代替这个:
select *
from table1
where id in(
select column
from table2
)
类似这样:
select *
from table1
where id in table2.column
我知道TABLE
可以用于指定一个表,但是仅当指定的表仅由1列组成时,它才有效
EDIT:不能选择使用IN, ANY, SOME
,因为我一直在寻找的真正用途是在join
运算符上,并且NOT IN
有时也会像创建一对多关系那样创建重复项
SQL中没有类似的快捷方式。让我解释一下原因。
在查询中,all表引用需要在JOIN
子句中进行。因此,您不能简单地引用FROM
除非 table2.col
子句中定义了table2
。 FROM
实际上是alias,默认为表名。
从性能的角度,我建议table2
:
exists
尤其是,这可以利用select t1.*
from table1 t1
where exists (select column
from table2 t2
where t2.column = t1.id
)
上的索引,并且具有与table2(column)
相同的语义。
使用JOIN会短一些。至少它不需要子查询或其他in
。
SELECT ... FROM
尽管此简单示例是内部联接,而不是半联接。内部联接是不同的,因为它在table2中每匹配的行产生一行。半联接即使与table2中的多行匹配,也只会为table1中的每一行产生一行。
如果要模拟半联接,请使用SELECT table1.*
FROM table1
JOIN table2 ON table1.id = table2.column
将结果减少为table1的每行一行:
DISTINCT
如果要检查诸如NOT EXISTS之类的内容,请使用排除联接:
SELECT DISTINCT table1.*
FROM table1
JOIN table2 ON table1.id = table2.column
无需在外部联接示例上使用DISTINCT。连接将不会有行重复,因为它只能“匹配任何行”一次。