Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 INSERT того или иного значения, в зависимости от количества записей в другой таблице  [new]
euthanatos
Member

Откуда:
Сообщений: 33
Здравствуйте, не хватает мозгов написать запрос.

Суть такова: таблица Т1 содержит необходимые данные, но не все. По этой причине из неё специальной процедурой наполняется (delete-insert) другая таблица Т2, которая должна больше отвечать требованиям полноты. Но вот незадача: в Т2 есть поле которое должно принимать в процессе наполнения одно из двух значений - 'S' или 'M' и суть его такова, что если в таблице Т1 есть несколько записей с реквизитами текущей добавляемой, то 'М', а если всего одна - то 'S'.

В общем-то как это сделать циклом или курсором - это примерно понятно. Но как это сделать как часть единственного (и единного) инсерта, то есть за один проход - вот это вопрос.

Немного кода, чтоб было понятно о чем речь:
DELETE FROM T2

INSERT INTO T2 (field_A, field_B, field_X)
SELECT
ttt.field_A,
ttt.field_B,
CASE если в T1 есть лишь одна запись с field_C и field_D над которыми select работает в данный момент THEN 'S' ELSE 'M' (или как-то так)
FROM T1 ttt


И наборы данных:

Т1 из которой наполняем
field_Afield_Bfield_Cfield_D
ПупкинВасилий50110.10.2010
ПетровИван50110.10.2010
ИвановПётр3340210.12.2009
БёртонТимбу!03.05.2012
ДеппДжонибу!24.06.2012


Т2, которую хочу видеть на выходе
field_Afield_Bfield_X
ПупкинВасилийM
ПетровИванM
ИвановПётрS
БёртонТимS
ДеппДжониS
27 мар 13, 09:23    [14100012]     Ответить | Цитировать Сообщить модератору
 Re: INSERT того или иного значения, в зависимости от количества записей в другой таблице  [new]
Добрый Э - Эх
Guest
merge - не вариант?
27 мар 13, 09:26    [14100018]     Ответить | Цитировать Сообщить модератору
 Re: INSERT того или иного значения, в зависимости от количества записей в другой таблице  [new]
euthanatos
Member

Откуда:
Сообщений: 33
Добрый Э - Эх,

А можно конкретно для описаного случая пример применения? Я пока слабо представляю возможности этой конструкции
27 мар 13, 09:31    [14100024]     Ответить | Цитировать Сообщить модератору
 Re: INSERT того или иного значения, в зависимости от количества записей в другой таблице  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
INSERT T2(field_A, field_B, field_X)
SELECT ttt.field_A,ttt.field_B,
ISNULL((SELECT 'S' FROM T1 WHERE T1.field_C=T2.field_A AND T1.field_D=T2.field_B HAVING COUNT(*)=1),'M')
FROM T1 ttt;
27 мар 13, 09:37    [14100042]     Ответить | Цитировать Сообщить модератору
 Re: INSERT того или иного значения, в зависимости от количества записей в другой таблице  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
автор
CASE если в T1 есть лишь одна запись с field_C и field_D над которыми select работает в данный момент THEN 'S' ELSE 'M' (или как-то так)


Переводится как

CASE WHEN (SELECT COUNT(*) FROM T1 tttt WHERE ttt.field_C  = tttt.field_C AND ttt.field_D = tttt.field_D) > 1 THEN 'M' ELSE 'S' END
27 мар 13, 09:37    [14100043]     Ответить | Цитировать Сообщить модератору
 Re: INSERT того или иного значения, в зависимости от количества записей в другой таблице  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
прямо "по написанному":
CASE WHEN exists
  (select 1 from T1 
    where field_C=ttt.field_C and field_D=ttt.field_D and 
    (field_A!=ttt.field_D or field_B!=ttt.field_B)) 
  THEN 'M' ELSE 'S' END
27 мар 13, 09:42    [14100062]     Ответить | Цитировать Сообщить модератору
 Re: INSERT того или иного значения, в зависимости от количества записей в другой таблице  [new]
euthanatos
Member

Откуда:
Сообщений: 33
iap
INSERT T2(field_A, field_B, field_X)
SELECT ttt.field_A,ttt.field_B,
ISNULL((SELECT 'S' FROM T1 WHERE T1.field_C=T2.field_A AND T1.field_D=T2.field_B HAVING COUNT(*)=1),'M')
FROM T1 ttt;

Ну наверное в условии должны все же указываться сравнимые поля, а не принципиально разные, а в остальном все три варианта работают ;)
Благодарю за помощь всех откликнувшихся!

ПС. Я сначала таки пробовал сам написать нечто подобное с использованием COUNT(*), но меня смутил mstudio с предупреждением о том, что не может привязать составной идентификатор (то есть псевдоним внешней таблицы) внутри CASE SELECT, так что я подумал что я что-то делаю не так и такой синтаксис не работает в принципе, а как оказалось, он страбильно ругается на это пока вся конструкция не будет завершена )
27 мар 13, 10:49    [14100406]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить