繁体   English   中英

多个查询作为单个查询

[英]Multiple Queries as a Single Query

两个查询

SELECT wavelength, reflectance 
FROM
  (SELECT 
      ROW_NUMBER() OVER(ORDER BY NULL) As RowNumber, * 
   FROM deodar) As foo 
WHERE (RowNumber % 5 = 0)

第一个查询结果将作为第二个查询数据的输入以执行操作

SELECT 
   wavelength, 
   (LEAD(wavelength) OVER (ORDER BY wavelength) - wavelength) /
     (CASE WHEN (LEAD(reflectance) OVER (ORDER BY wavelength) - reflectance) = 0 THEN 1
           ELSE (LEAD(reflectance) OVER (ORDER BY wavelength) - reflectance) END)
      AS reflectance   
FROM  deodar

执行完操作后,我想显示结果

简单的答案是您可以使用子选择。

SELECT 
   wavelength, 
   (LEAD(wavelength) OVER (ORDER BY wavelength) - wavelength) /
     (CASE WHEN (LEAD(reflectance) OVER (ORDER BY wavelength) - reflectance) = 0 THEN 1
           ELSE (LEAD(reflectance) OVER (ORDER BY wavelength) - reflectance) END)
      AS reflectance   
FROM (
   SELECT wavelength, reflectance 
   FROM
     (SELECT 
         ROW_NUMBER() OVER(ORDER BY NULL) As RowNumber, * 
      FROM deodar) As foo 
   WHERE (RowNumber % 5 = 0)
) bar

还不清楚是否要在过滤之前或之后应用LEAD操作。 如果希望在过滤之前应用它们,则可以颠倒嵌套的顺序。

为了进行更复杂的操作或提高可读性/可维护性,PostgreSQL(和最新的ANSI SQL)支持公用表表达式 ,使您可以创建多个虚拟表并从中进行选择。 各个虚拟表可以相互引用,甚至可以互相引用。 Microsoft有一些非常好的文档。

根据所使用的SQL引擎,CTE的性能可能与子选择的性能不同。 在虚拟表仅使用一次的简单情况下,子选择可能会表现更好(如果存在任何性能差异)。

CTE解决方案如下所示:

WITH bar AS (
   SELECT wavelength, reflectance 
   FROM
     (SELECT 
         ROW_NUMBER() OVER(ORDER BY NULL) As RowNumber, * 
      FROM deodar) As foo 
   WHERE (RowNumber % 5 = 0)
 )
SELECT
   wavelength, 
   (LEAD(wavelength) OVER (ORDER BY wavelength) - wavelength) /
     (CASE WHEN (LEAD(reflectance) OVER (ORDER BY wavelength) - reflectance) = 0 THEN 1
           ELSE (LEAD(reflectance) OVER (ORDER BY wavelength) - reflectance) END)
      AS reflectance   
FROM bar
SELECT wavelength,reflectance 
FROM
    (SELECT ROW_NUMBER() OVER(ORDER BY NULL) As RowNumber,* FROM deodar) As foo         
WHERE(RowNumber%5=0)

UNION

SELECT wavelength, 
   (LEAD(wavelength) OVER (ORDER BY wavelength) - wavelength)/
   (CASE WHEN (LEAD(reflectance) OVER (ORDER BY wavelength) - reflectance) = O THEN 1
    ELSE (LEAD(reflectance) OVER (ORDER BY wavelength) - reflectance) END)
   AS reflectance
FROM  deodar

使用UNION的唯一条件是所有查询必须返回相同的列(类型和名称)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM