Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2012.02.19;
Скачать: CL | DM;

Вниз

Использование одной связки таблиц несколько раз в одном запросе.   Найти похожие ветки 

 
И. Павел ©   (2011-10-31 12:06) [0]

Здравствуйте.

Работаю с БД MS SQL SERVER.
В моем запросе, посылаемом к БД из Delphi (или выполняемого непосредственно в БД, не важно) нужно несколько раз использовать некоторую выборку вида (не обязательно простой SELECT FROM WHERE, могут быть JOIN и что-нибудь еще). От раза к разу может отличаться набор полей в SELECT, условия в WHERE ну и что-нибудь еще. Мне нужно, чтобы каждый раз эта выборка выглядела одинаково. Т.е. недопустима ситуация, когда первый под-SELECT выполнится, а до второго под-SELECT какой-нибудь параллельный поток внесет в таблицы изменения (например, вставит строку в одну из используемых таблиц), и второй SELECT выдаст другую выборку, чем первый. Подскажите, пожалуйста, какой подход в этом случае можно использовать:

1. Просто повторять запросы. Можно ли так писать? Или при этом возможна ситуация, когда между этими SELECT-ами выборка изменится, т.к. параллельный поток сделает, например, INSERT?

INSERT/SELECT/...
 ...
 SELECT a FROM t LEFT JOIN t2 ON ... WHERE ...
 ...
 SELECT b FROM t LEFT JOIN t2 ON ... WHERE ...
 ...


2. Писать общую выборку в WITH. Неудобство этого подхода состоит в том, что нужно будет сразу вытягивать максимальную выборку, и потом с ней работать. Выборка в with при этом будет считаться один раз, или она может пересчитываться каждый раз?

WITH tab AS (SELECT a, b FROM t LEFT JOIN ...)
INSERT/SELECT/...
 ...
 SELECT a FROM tab WHERE a = 10
 ...
 SELECT b FROM tab WHERE b = 20
 ...


3. Или же только созданием временной таблицы можно добиться того, чтобы в запросе была "переменная", возвращаемая гарантированно одну и ту же выборку каждый раз при использовании ее в запросе?

Заранее спасибо.

PS: явные блокировки на редактирования таблиц лучше не делать, т.к. запрос выполняется достаточно долго.
PPS: пытался сформулировать вопрос максимально понятно, но получилось все же не очень. Если вопрос не совсем понятен - напишите, и я уточню формулировку.


 
И. Павел ©   (2011-10-31 12:25) [1]

Хотя это вопрос на тему БД... Перенесите, пожалуйста в конференцию "Базы".


 
Ega23 ©   (2011-10-31 12:25) [2]

http://msdn.microsoft.com/ru-ru/library/ms173763.aspx


 
Ega23 ©   (2011-10-31 12:26) [3]

Это если я правильно понял вопрос.


 
картман ©   (2011-10-31 13:29) [4]


> Выборка в with при этом будет считаться один раз, или она
> может пересчитываться каждый раз?


http://technet.microsoft.com/ru-ru/library/ms190766.aspx

Обобщенные табличные выражения (ОТВ) можно представить себе как временные результирующие наборы


 
И. Павел ©   (2011-10-31 13:36) [5]

> [2] Ega23 ©   (31.10.11 12:25)

Спасибо. Сколько не читаю про уровни изоляции - каждый раз они кажутся запутанными.
Как я понимаю, для того, чтобы не волноваться о том, что два одинаковых SELECT в разных местах вернут разные данные, нужно поставить
SET TRANSACTION ISOLATION LEVEL SNAPSHOT.

А внутренние подзапросы к выборке в with тоже могут меняться от вызова к вызову? Например:

WITH a AS (...)

SELECT
...
 (SELECT * FROM a)
 ...
 (SELECT * FROM a)


 
И. Павел ©   (2011-10-31 13:36) [6]

> [4] картман ©   (31.10.11 13:29)
>
> > Выборка в with при этом будет считаться один раз, или
> она
> > может пересчитываться каждый раз?
>
>
> http://technet.microsoft.com/ru-ru/library/ms190766.aspx
>
> Обобщенные табличные выражения (ОТВ) можно представить себе
> как временные результирующие наборы

Ясно, спасибо.



Страницы: 1 вся ветка

Текущий архив: 2012.02.19;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.011 c
2-1320320243
dj-Oleg
2011-11-03 14:37
2012.02.19
Ленточный конвейер....


15-1319789522
TUser
2011-10-28 12:12
2012.02.19
Задача: спасти мир (от философов)


15-1316790219
Rouse_
2011-09-23 19:03
2012.02.19
Выбираем очередных претендентов на знак "Мастер Дельфи"


15-1319918066
xayam
2011-10-29 23:54
2012.02.19
Миллионное посещение


15-1319778083
prestig
2011-10-28 09:01
2012.02.19
файл hosts