在 "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, SOME
的 TABLE
的存在来指定 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" 一次。
我想知道是否有任何快捷方式可以指定 IN
必须检查匹配项的列。
示例:
而不是这个:
select *
from table1
where id in(
select column
from table2
)
像这样:
select *
from table1
where id in table2.column
我知道 IN, ANY, SOME
的 TABLE
的存在来指定 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" 一次。