Форум: "Прочее";
Текущий архив: 2012.02.19;
Скачать: [xml.tar.bz2];
ВнизИспользование одной связки таблиц несколько раз в одном запросе. Найти похожие ветки
← →
И. Павел © (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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.005 c