【问题标题】:SQL Conditional on SELECT Subquery valueSELECT 子查询值的 SQL 条件
【发布时间】:2021-02-06 21:43:53
【问题描述】:

我想对我的选择子查询应用条件检查。我怎样才能做到最好?

这是最初的查询:

SELECT 
  table1.column1, 
  (SELECT min(table2.column1) FROM table2 WHERE table2.table1Id = table1.id) as subResult
FROM table1
WHERE table1.column2 = "something"

我想添加 WHERE 条件subResult = :parameter。而:parameter 是可选的,这意味着如果:parameter 为空,则在结果中包含行。

WHERE table1.column2 = "something" AND (:parameter is null or subResult = :parameter)

但我无法在 WHERE 条件中引用子查询 subResult 的结果。

我可以将子查询复制/粘贴到 WHERE 子句中,但这似乎草率且容易出错:

SELECT 
  table1.column1, 
  (SELECT min(table2.column1) FROM table2 WHERE table2.table1Id = table1.id) as subResult
FROM table1
WHERE table1.column2 = "something" AND (:parameter is null or (SELECT min(table2.column1) FROM table2 WHERE table2.table1Id = table1.id) = :parameter)

【问题讨论】:

  • 问题是我不能在 where 子句中引用subResult
  • 使用分析器应用程序将有助于告诉您执行时间;此处未指定正在使用的数据库。 (例如,对于 SQL Server、SQL Profiler)

标签: sql oracle subquery where-clause lateral-join


【解决方案1】:

如果您运行的是 Oracle 12 或更高版本,我建议您使用横向连接:

select t1.column1, t2.min_column1
from table1 t1
outer apply (select min(t2.column1) min_column1 from table2 t2 where t2.table1id = t1.id) t2
where 
    t1.column2 = 'something' 
    and (:parameter is null or t2.min_column1 = :parameter)

在早期版本中,您可以使用子查询或 CTE:

select *
from (
    select t1.column1, 
        (select min(t2.column1) from table2 t2 where t2.table1id = t1.id) as min_column1
    from table1 t1
) t
where 
    t1.column2 = 'something' 
    and (:parameter is null or t2.min_column1 = :parameter)

【讨论】:

    【解决方案2】:
    select * 
    from  (SELECT 
             table1.column1, 
            (SELECT min(table2.column1) FROM table2 WHERE table2.table1Id = table1.id) as  subResult
        FROM table1
        WHERE table1.column2 = "something"
        )
    where   subResult = decode(:p,null , subResult ,:p)
    

    【讨论】:

    • 请添加解释以提高洞察力
    猜你喜欢
    • 2021-01-16
    • 2011-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多