这是我的第一篇文章,我是SQL的初学者,所以真的希望你们能帮我解决这个问题。
当我想在IN()中编写子查询时,我只能编写一个子查询。如果我再加一个就会出错。我无法弄清楚原因。希望有人可以提供帮助
这很好用:
SELECT name, continent
FROM world
WHERE continent IN (SELECT continent FROM world WHERE name ='belize')
但是每当我再添加一个子查询时,就会出现错误。
SELECT name, continent
FROM world
WHERE continent IN (SELECT continent FROM world WHERE name ='belize',
SELECT continent FROM world WHERE name ='belgium')
真的很感激,如果有人可以帮助我。非常感谢。
答案 0 :(得分:2)
因为,您是SELECT
来自同一个表,您可以使用OR
条件组合这两个语句。
SELECT name, continent FROM world
WHERE continent IN
(
SELECT continent FROM world
WHERE name = 'belize'
OR name = 'belgium'
);
答案 1 :(得分:1)
只需使用OR
来判断两者是否存在。
SELECT name, continent
FROM world
WHERE continent IN (
SELECT continent
FROM world
WHERE name ='belize' OR name ='belgium'
)
答案 2 :(得分:0)
这是一个没有使用子查询的答案(根据我的经验)几乎总是更有效:
SELECT DISTINCT name, continent
FROM world
JOIN world world2 ON world.continent = world2.continent
WHERE world2.name IN('belize' , 'belgium')
现在我看到这一点,我意识到DISTINCT
子句的必要性(如果你指定了同一个大陆的2个国家,防止重复行 - 在你的具体例子中不是问题,但我认为可能是未来边缘条件的一部分)可能会降低效率。最好坚持使用子查询。
答案 3 :(得分:0)
( SELECT continent FROM world WHERE name ='belize'
, SELECT continent FROM world WHERE name ='belgium' )
看来您已假定列表中的每个值都需要子查询。即从2个子查询得到的结果:
('Europe', 'Europe')
但这不是SQL处理子查询IN的方式(此处)
一旦使用子查询,它就会将该子查询视为生成潜在值的COLUMN。因此,不要尝试一次构建一个“in list”,只需通过一列即可。
考虑这个简单的查询:
SELECT DISTINCT continent FROM world
它会产生一系列结果
Africa
Antarctica
Asia
Australia
Europe
North America
South America
如果我们使用那个简单的查询IN(这里),就像这样:
SELECT country, continent FROM world
WHERE continent IN ( SELECT DISTINCT continent FROM world )
它会正常工作,并列出来自各大洲的所有国家/地区。它确实不是一个非常明智的查询,但关键是单个子查询可以返回许多行,并且每行的值都会被评估。
具有讽刺意味的是,你可以通过这样做UNION
或UNION ALL
来使用你的子查询:
SELECT name, continent
FROM world
WHERE continent IN (SELECT continent FROM world WHERE name ='belize'
UNION ALL
SELECT continent FROM world WHERE name ='belgium')
这浪费了资源,但它是有效的语法,因为它正在建立一个允许的结果列。