2016-01-30 4 views
0

У меня есть запрос базовой структурыПорядок выполнения запроса

with cte1 as (Select *query on tbl1*) 
,cte2 as (select *query on tbl1* 
     Exception join cte1) 

Select * from cte1 
union all 
Select * from cte2 

И я действительно понятия не имею, могу ли я быть уверен, что это будет вести себя, как ожидается, - каждый из КТР производят подобные строки, но будет иметь разный логика - я хочу, чтобы cte1 прошел через таблицу с ее логикой, а затем cte2 снова просмотрел ту же таблицу, после того, как cte1 выбрал все записи, которые относятся к ней, будет ли это работать?

Редактировать: Хорошо, я создал некоторые данные и наметил, где я заинтересован. Я не уверен, как интерпретировать ответ philipxy с вышеизложенным - я могу понять из его ответа, чего ожидать от cte1, но я не совсем понимаю, что такое cte2 - делает ли cte1 «объявленным» до cte2, так что их значения заблокирован, как только запрос начнется?

enter image description here

+0

Вы пытались просмотреть план доступа к запросу? – zack

+1

Пожалуйста, отредактируйте свой вопрос, чтобы проследить пример, показывающий действия, которые вы боитесь, может случиться. Ваше сообщение не говорит достаточно об этом, чтобы мы знали, что вы имеете в виду, то есть, что вы имеете в виду, как работает SQL. – philipxy

+0

Я отредактировал с моими проблемами, спасибо –

ответ

0

Вы, кажется, запутались в интерпретации запросов SQL. Возможно, все запросы или, возможно, просто запросы CTE или, возможно, рекурсивные запросы CTE.

Значение реляционного запроса основано на именах, представляющих значения (которые являются таблицами), и на значении выражения, которое вычисляется из этих значений, чтобы дать другие значения.

Обновление затем вызывает новое текущее значение базовой таблицы, то есть значение, связанное с именем базовой таблицы, как значение, вычисленное по запросу. SQL-запросы описывают, как обновленные строки в терминах входных строк, но все строки обновляются сразу.

Имя базовой таблицы означает ее значение перед выполнением запроса. Рекурсивно определенное имя CTE - это имя, которое используется в его собственном определении. Это описывает цикл, который при выполнении дает новое значение для имени CTE на каждой итерации. (Вы не делали этого здесь.) В противном случае имя CTE означает значение, данное ему, когда оно было введено.

Поскольку этот запрос CTE не является рекурсивным, вы можете просто взять имена базовой таблицы и имена CTE как стоящие за их значениями. Таким образом, ваши имена CTE имеют только одно значение, а когда вы выбираете из таблицы с именем (base или CTE), это не влияет на его значение.

+0

Означает ли это, что порядок решения текущей стоимости - это порядок, объявляющий ctes? cte1 заблокирован, то cte2 заблокирован на основе заблокированных значений cte1? Кроме того, я пытался сделать вставку из таблицы B в таблицу A, ссылаясь на таблицу A - как она может себя вести? Что-то вроде: 'Insert into A select * from B join A' Всякий раз, когда я был в ситуации, мне нужно было это сделать, это было бы на каком-то последовательном ключе, скажем, вставить ключ = 1, затем key = 2 by видя, что 1s уже есть, но я был обеспокоен тем, что запрос увидит, что новые 2s вставлены до того, как они закончили 1s –

+0

. Я хотел бы сказать «да» или «нет», но вы пишете в странных выражениях. Только рекурсивно определенные определения имен таблиц CTE определяют цикл; в противном случае имя таблицы имеет только одно значение в SELECT, а UPDATE меняет все строки одновременно. Это похоже на 's1 = 'x' + s; s2 = s1 + s' имеет только одно значение для строк s, s1 и s2, а строки обновляются сразу всеми символами. См. Мой обновленный ответ. PS Играйте с http://www.sqlfiddle.com. – philipxy

+0

@ scott.se Если заказ не имел смысла, вы можете изменить спецификации для 'cte1' и' cte2'. Поскольку cte2 ссылается на cte1, он должен немедленно стать ясным, если порядок имеет значение. Но в любом случае это не имеет значения.Те же самые значения будут выбраны независимо от того, как это работает. Здесь нет ничего, что меняет любые строки. – user2338816

Смежные вопросы