Переписать / переформатировать несколько вложенных вложенных запросов в режиме отладки - PullRequest
1 голос
/ 29 апреля 2019

Есть ли лучший способ переписать несколько вложенных подзапросов, чтобы их было легче понять и отладить без снижения производительности?

(Примечание: в моем случае я получил несколько довольно сложных подзапросов, многие с несколькими объединениями, где предложение, некоторые операторы case и т. Д. Запись всего в виде одного большого блока кода является кошмаром отладки)

Например: я хочу переписать это:

SELECT DoSomething(x) AS x
FROM (SELECT DoSomething(x) AS x
      FROM (SELECT DoSomething(x) AS x
            FROM (SELECT DoSomething(x) AS x
                  FROM (SELECT DoSomething(x) AS x
                        FROM (SELECT x
                              FROM tbl_1) AS Q1) AS Q2) AS Q3) AS Q4) AS Q5

На что-то вроде этого:

--Q1
SELECT *
INTO #Q1
FROM (SELECT x
      FROM tbl_1) AS Q1

--Q2
SELECT *
INTO #Q2
FROM (SELECT DoSomething(x)
      FROM Q1) AS Q2

--Q3
SELECT *
INTO #Q3
FROM (SELECT DoSomething(x)
      FROM Q2) AS Q3

--Q4
SELECT *
INTO #Q4
FROM (SELECT DoSomething(x)
      FROM Q3) AS Q3

--Q5
SELECT *
INTO #Q5
FROM (SELECT DoSomething(x)
      FROM Q4) AS Q4

--Do Something with Q5 then cleanup

DROP TABLE #Q1
DROP TABLE #Q2
DROP TABLE #Q3
DROP TABLE #Q4
DROP TABLE #Q5

Пример выше, хотя гораздо больше кода (надеюсь) позволит отладчику более легко просматривать / выбирать отдельные подзапросы и помогает ему / ей разобраться в потенциальных проблемах

1 Ответ

2 голосов
/ 29 апреля 2019

Возможно, вы захотите взглянуть на CTE .

Вы можете написать свой пример так:

WITH
Q1
AS
(
SELECT x
       FROM tbl_1
),
Q2
AS
SELECT DoSomething(x)
       FROM Q1
),
Q3
AS
(
SELECT DoSomething(x)
       FROM Q2
),
Q4
AS
(
SELECT DoSomething(x)
       FROM Q3
),
Q5
AS
(
SELECT DoSomething(x)
       FROM Q4
)
SELECT *
       FROM Q5;
...