在 "in" 运算符上指定 table-列

Specify table-column on "in" operator

我想知道是否有任何快捷方式可以指定 IN 必须检查匹配项的列。

示例:
而不是这个:

select * 
from table1
where id in(
    select column
    from table2
) 

像这样:

select * 
from table1
where id in table2.column

我知道 IN, ANY, SOMETABLE 的存在来指定 table,但只有当指定的 table 仅由 1 列组成时它才有效

编辑:使用join不是一种选择,因为我一直在寻找的真正用途是在NOT IN运算符上,而且JOIN 有时像在一对多关系中一样创建重复项

SQL 中没有这样的捷径。让我解释一下原因。

在查询中,所有 table 引用需要在FROM 子句中进行。因此,您不能简单地引用 table2.col ,除非 table2 已在 FROM 子句中定义。 table2 实际上是一个 别名 ,默认为 table 名称。

从性能的角度,我会推荐exists:

select t1.* 
from table1 t1
where exists (select column
              from table2 t2
              where t2.column = t1.id
             ) 

特别是,这可以利用 table2(column) 上的索引并且具有与 in 相同的语义。

使用 JOIN 会更短一些。至少它不需要子查询或另一个 SELECT ... FROM.

SELECT table1.* 
FROM table1
JOIN table2 ON table1.id = table2.column

虽然这个简单的例子是内连接,而不是半连接。内部联接不同,因为它在 table2 中为每个匹配行生成一行。半连接只为 table1 中的每一行生成一行,即使它匹配 table2 中的多行。

如果要模拟半连接,使用DISTINCT将结果减少为每行table1一行:

SELECT DISTINCT table1.* 
FROM table1
JOIN table2 ON table1.id = table2.column

如果您想检查 NOT EXISTS 之类的内容,请使用排除连接:

SELECT table1.* 
FROM table1
LEFT OUTER JOIN table2 ON table1.id = table2.column
WHERE table2.column IS NULL

无需在外连接示例中使用 DISTINCT。连接不会有行重复,因为它只能 "match no rows" 一次。