Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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
15-1319833839
Германн
2011-10-29 00:30
2012.02.19
Кто-нибудь помнит TP 7.0?


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


15-1318709342
Юрий Зотов
2011-10-16 00:09
2012.02.19
ММП 28-го ?


15-1320263467
GreyWolf83
2011-11-02 22:51
2012.02.19
UTF-8 сравнение строк без учета регистра???


13-1127735614
MeF Dei Corvi
2005-09-26 15:53
2012.02.19
Получение информации о системе





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский