【问题标题】:How to use the Output of one SQL Statement in another如何在另一个 SQL 语句中使用一个 SQL 语句的输出
【发布时间】:2011-09-01 14:11:51
【问题描述】:

我有如下声明:

select region_id from regions
where region_name = 'Europe' 

我需要以下语句中的输出,其中 'bla' 是:

select count(*) from countries
where region_id = 'bla'

我该怎么做?

【问题讨论】:

  • 您更改了对我们的查询!它从distinct * 开始,现在是count(*),因此所有答案都不同步。

标签: sql oracle oracle11g


【解决方案1】:

试试IN clause

select distinct * from countries
where region_id IN (select region_id from regions
where region_name = 'Europe')

【讨论】:

    【解决方案2】:

    救援子查询!

    select distinct * 
    from countries
    where region_id=(select top 1 ir.region_id 
                     from regions ir
                     where ir.region_name = 'Europe' )
    

    或者,您可以使用 in 并为其提供从您的查询返回的项目列表。

    【讨论】:

    • 你看一下,他们没有添加限制......我被MSSQL宠坏了。
    • 不过我还是会坚持使用 MSSQL。
    【解决方案3】:

    使用 EXISTS:

    SELECT c.* 
      FROM COUNTRIES c
     WHERE EXISTS (SELECT NULL 
                     FROM REGIONS r
                    WHERE r.region_id = c.region_id
                      AND r.region_name = 'Europe')
    

    我更喜欢使用 EXISTS 而不是 IN,因为:

    • Oracle 中的IN 限制为 1,000 个值
    • EXISTS 允许您在必要时匹配多个列
    • EXISTS 在第一次匹配时返回 true,根据需要可以比 IN/etc 更快

    大多数错误 EXISTS 是相关子查询,但它的执行方式不同且不评估 SELECT 子句 - 您可以使用以下方法进行测试:

    SELECT c.* 
      FROM COUNTRIES c
     WHERE EXISTS (SELECT 1/0
                     FROM REGIONS r
                    WHERE r.region_id = c.region_id
                      AND r.region_name = 'Europe')
    

    【讨论】:

    • 我不确定您选择EXISTS 而非IN 的理由是否完全正确。 IN 对 1,000 个值的限制仅适用于与表达式列表而不是子查询进行比较时,IN 将使用多个列,尽管语法有点笨拙,IN 和 EXISTS 将如果可能,经常使用相同的执行计划
    猜你喜欢
    • 2017-02-17
    • 2021-03-21
    • 1970-01-01
    • 1970-01-01
    • 2016-06-21
    • 2011-03-28
    • 2019-03-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多