Главная страница
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.01 c
15-1319715427
Бездомный
2011-10-27 15:37
2012.02.19
Как лучше называть ключевое (и не только) поля таблиц?


15-1320406954
KilkennyCat
2011-11-04 14:42
2012.02.19
Управление проектами


11-1215359585
NikFel
2008-07-06 19:53
2012.02.19
Как убрать HScroll в TkolListView.


2-1320320243
dj-Oleg
2011-11-03 14:37
2012.02.19
Ленточный конвейер....


3-1272022775
Kobylyansky
2010-04-23 15:39
2012.02.19
Firebird+тип сервера