0

我有一个使用 INTERSECT 执行的复杂选择查询(Query-1),它返回特定列的 ID。

查询 #1:

SELECT my_id FROM my_table
INTERSECT
SELECT my_id FROM other_table;

现在还有另一个更复杂的查询,它需要多次查询 #1 的结果。

查询 #2:

SELECT * 
FROM
    (SELECT my_id, col_1, my_value
     FROM my_table
     WHERE my_id IN (result from query-1) 
       AND col_3 IN (SELECT col_3 FROM another_table1 
                     WHERE my_id IN (result from query-1) 
                       AND another_col IN (SELECT another_col 
                                           FROM another_table2 
                                           WHERE my_id IN (result from query-1))))
    PIVOT 
        (MIN(my_value)
            FOR(col_1) IN(1 AS name, 2 AS lastname, 3 AS address)
        )

正如您所见,query-1 的结果在 query-2 中需要多次,我尝试在任何需要的地方替换 query-2 中的整个 query-1,这增加了查询的复杂性和可读性。

有没有办法以简单的方式做到这一点?

4

2 回答 2

1

如何使用with子句(子查询分解子句):

with query-1 as (SELECT my_id FROM my_table
INTERSECT
SELECT my_id FROM other_table)

SELECT * FROM
(
   SELECT my_id, col_1, my_value
   FROM my_table
   WHERE my_id IN (select id from query-1) AND col_3 IN
      (SELECT col_3 FROM another_table1 WHERE my_id IN (select id from query-1) AND another_col IN
         (SELECT another_col FROM another_table2 WHERE my_id IN (select id from query-1))
)
)
PIVOT (
   MIN(my_value)
   FOR(col_1)
   IN(1 AS name, 2 AS lastname, 3 AS address)
)
于 2021-10-14T18:06:02.907 回答
0

对于您将多次使用的任何查询,我肯定会使用 View。

我将首先编写以下代码:

Create View Query1
as
SELECT my_id FROM my_table
INTERSECT
SELECT my_id FROM other_table;

一旦我选择了上面的代码,我将执行(F5)它。这将存储视图。然后我将编写下面的代码并在您想调用它时执行:

Select * From Query1

或者您可以简单地在 Query2 中使用 Query1。

于 2021-10-14T18:30:06.553 回答