在“ in”运算符上指定表列

问题描述 投票:0回答:2

我想知道是否存在任何快捷方式来指定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有时也会像创建一对多关系那样创建重复项

mysql sql database shortcut
2个回答
2
投票

SQL中没有类似的快捷方式。让我解释一下原因。

在查询中,all表引用需要在JOIN子句中进行。因此,您不能简单地引用FROM 除非 table2.col子句中定义了table2FROM实际上是alias,默认为表名。

从性能的角度,我建议table2

exists

尤其是,这可以利用select t1.* from table1 t1 where exists (select column from table2 t2 where t2.column = t1.id ) 上的索引,并且具有与table2(column)相同的语义。


1
投票

使用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。连接将不会有行重复,因为它只能“匹配任何行”一次。

© www.soinside.com 2019 - 2024. All rights reserved.