[英]Can someone explain how the sql query works?
下面的 SQL 查询获取所有具有不同姓氏的 first_names。
select a.first_name
from names a
WHERE a.first_name in (
select b.first_name
from names b
WHERE a.last_name<>b.last_name
)
我无法弄清楚这到底是如何工作的。 我认为会发生的是,对于表中的每一行,子查询将检查是否存在具有不同姓氏的行。 但是检查只发生在名字的相同值之间。 有人可以解释这实际上是如何工作的。
首先,正如我在评论中提到的,我建议为此使用HAVING
。 它不需要对表进行 2 次扫描,只需一次,它不会返回相同first_name
的重复项,并且您可能更容易理解:
SELECT first_name
FROM dbo.names
GROUP BY first_name
HAVING COUNT(DISTINCT last_name) > 1;
这应该是不言自明的; 它返回对于first_name
的每个值有超过 1 个不同的last_name
值的行。
对于您的查询,让我们看看WHERE
:
WHERE a.first_name IN (SELECT b.first_name
FROM names b
WHERE a.last_name<>b.last_name
首先,我们“加入”两个names
实例(别名a
ad b
),其中两个实例中last_name
的值不同。 这很可能是一项昂贵的操作; 如果您有一个表将有 1,000 行,并且它有 900 个不同的last_name
值,那么您最终会得到每行数百个匹配项的连接。
之后,它检查连接的行集中别名为a
的names
实例中的行的first_name
的值; 确实如此,那么有 2 个(或更多)具有不同last_name
值的相同first_name
实例。
在上下文中使用带有子查询的IN
与使用值的文字列表没有什么不同。 WHERE SomeColumn IN (1,2,3,4,5,7)
将与WHERE SomeColumn IN (SELECT I FROM SomeTable)
相同,如果表SomeTable
中的列I
具有值1
, 2
, 3
, 4
, 5
, 和7
.
你可以把它读成这样的内部连接,或者 EXISTS :
查询 2 :
select a.first_name
from names a
inner join names b
on a.first_name = b.first_name
and a.last_name <> b.last_name
Group by a.first_name, a.last_name
结果:
| first_name |
|------------|
| john |
| john |
| john |
查询 3 :
select a.first_name
from names a
where exists(
select 1 from names b
WHERE a.first_name = b.first_name
and a.last_name <> b.last_name
)
结果:
| first_name |
|------------|
| john |
| john |
| john |
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.