Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
 Re: Обновить поля таблицы из другой связанной таблицы  [new]
Konst_One
Member

Откуда:
Сообщений: 11538
UPDATE A 
SET A.volume =LTRIM( (select ' ' + t.vol from @t2 t where t.[key] = A.[key] for xml path('')) )
FROM @T1 A RIGHT JOIN @t2 B ON A.[key] = B.[key] 
WHERE A.cond='YES';


лишнее выкинул
15 янв 15, 17:08    [17123608]     Ответить | Цитировать Сообщить модератору
 Re: Обновить поля таблицы из другой связанной таблицы  [new]
ALARMus
Member

Откуда:
Сообщений: 541
Konst_One,

спасибо, а @ оставшиеся может тоже все убрать ?
15 янв 15, 17:27    [17123778]     Ответить | Цитировать Сообщить модератору
 Re: Обновить поля таблицы из другой связанной таблицы  [new]
Konst_One
Member

Откуда:
Сообщений: 11538
ALARMus
Konst_One,

спасибо, а @ оставшиеся может тоже все убрать ?


что простите убрать? это ваш тестовый пример, который вы не удосужились даже сделать
15 янв 15, 17:29    [17123796]     Ответить | Цитировать Сообщить модератору
 Re: Обновить поля таблицы из другой связанной таблицы  [new]
ALARMus
Member

Откуда:
Сообщений: 541
Konst_One,

Я все удосужился сделать сразу же как только пришел от Вас первый длинный пост - проверил его полностью.
Просто там где Вы написали "лишнее выкинул", не надо ли там так же убрать оставшиеся символы "@" ?
15 янв 15, 17:32    [17123816]     Ответить | Цитировать Сообщить модератору
 Re: Обновить поля таблицы из другой связанной таблицы  [new]
Konst_One
Member

Откуда:
Сообщений: 11538
ALARMus
Konst_One,

Я все удосужился сделать сразу же как только пришел от Вас первый длинный пост - проверил его полностью.
Просто там где Вы написали "лишнее выкинул", не надо ли там так же убрать оставшиеся символы "@" ?


если у вас таблицы и они именно так и называются, то да, можете убрать @ из запроса
15 янв 15, 17:34    [17123831]     Ответить | Цитировать Сообщить модератору
 Re: Обновить поля таблицы из другой связанной таблицы  [new]
Glory
Member

Откуда:
Сообщений: 104760
ALARMus
Просто там где Вы написали "лишнее выкинул", не надо ли там так же убрать оставшиеся символы "@" ?

А вы знаете, что это за символы ?
15 янв 15, 17:35    [17123839]     Ответить | Цитировать Сообщить модератору
 Re: Обновить поля таблицы из другой связанной таблицы  [new]
ALARMus
Member

Откуда:
Сообщений: 541
Glory,

Нет не знаю,
но предполагаю, что используется как временная (в памяти) таблица(в данном случае, а так же может являться таким же временным полем при ином использовании) без создания\записи\сохранения в самой БД этой таблицы\поля.
15 янв 15, 17:48    [17123916]     Ответить | Цитировать Сообщить модератору
 Re: Обновить поля таблицы из другой связанной таблицы  [new]
ALARMus
Member

Откуда:
Сообщений: 541
Подскажите если в конструкции

UPDATE T1
SET T1.x=T2.y
...
FROM T1  RIGHT JOIN T2
ON T1.key=T2.key
WHERE ...


Необходимо добавить условие, чтобы брались только те значения из T2, у которых T2.key встречается только 1 раз - что добавить в запрос ?
16 янв 15, 11:14    [17126320]     Ответить | Цитировать Сообщить модератору
 Re: Обновить поля таблицы из другой связанной таблицы  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
ALARMus,

NOT EXISTS()
16 янв 15, 11:27    [17126449]     Ответить | Цитировать Сообщить модератору
 Re: Обновить поля таблицы из другой связанной таблицы  [new]
Glory
Member

Откуда:
Сообщений: 104760
ALARMus
Необходимо добавить условие, чтобы брались только те значения из T2, у которых T2.key встречается только 1 раз - что добавить в запрос ?

научитесь решать задачи поэтапно
1ый этап - найти "те значения из T2, у которых T2.key встречается только 1 раз "
2ой этап - использовать полученный набор из 1го этапа в update
16 янв 15, 11:50    [17126643]     Ответить | Цитировать Сообщить модератору
 Re: Обновить поля таблицы из другой связанной таблицы  [new]
ALARMus
Member

Откуда:
Сообщений: 541
я бы предположил отобрать вот так
select * from T2
having count(T2.key)=1


Но чувствую что это будет не правильно, и даже было бы верно понятия не имею как это прикрутить к имеющемуся join
16 янв 15, 13:27    [17127369]     Ответить | Цитировать Сообщить модератору
 Re: Обновить поля таблицы из другой связанной таблицы  [new]
ALARMus
Member

Откуда:
Сообщений: 541
iap,

Not Exists
использовать после
ON

не получиться ли что это отнесется к where и отбора не выйдет в нужном месте.
16 янв 15, 13:30    [17127389]     Ответить | Цитировать Сообщить модератору
 Re: Обновить поля таблицы из другой связанной таблицы  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
ALARMus,

я вот не очнеь понимаю - вы угадываете по ходу,или все таки пытаетесь начала прочесть хелп по предложеному оператору и только потом спрашивате ???? Бо пока у меня уверенность в первом варианте событий
16 янв 15, 13:34    [17127408]     Ответить | Цитировать Сообщить модератору
 Re: Обновить поля таблицы из другой связанной таблицы  [new]
ALARMus
Member

Откуда:
Сообщений: 541
Maxx,

Нет я не угадываю.
16 янв 15, 13:35    [17127420]     Ответить | Цитировать Сообщить модератору
 Re: Обновить поля таблицы из другой связанной таблицы  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
ALARMus,

лучше бы сказали, PK у таблицы есть или нет.
16 янв 15, 13:37    [17127441]     Ответить | Цитировать Сообщить модератору
 Re: Обновить поля таблицы из другой связанной таблицы  [new]
ALARMus
Member

Откуда:
Сообщений: 541
Читаем описание EXISTS:
Определяет вложенный запрос, проверяемый на наличие строк.
Синтаксис:
EXISTS subquery
Возвращает значение TRUE, если вложенный запрос содержит хотя бы одну строку.

Отлично, значит для имеющегося случая

UPDATE T1
SET T1.x=T2.y
...
FROM T1  RIGHT JOIN T2
ON T1.key=T2.key
WHERE ...


Ну вот не вижу я из описания где можно встроить этот оператор.
16 янв 15, 13:46    [17127519]     Ответить | Цитировать Сообщить модератору
 Re: Обновить поля таблицы из другой связанной таблицы  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
ALARMus,

т.е. секцию примеры вы недосмотрели ?
16 янв 15, 13:57    [17127622]     Ответить | Цитировать Сообщить модератору
 Re: Обновить поля таблицы из другой связанной таблицы  [new]
ALARMus
Member

Откуда:
Сообщений: 541
UPDATE T1
SET T1.x=T2.y
...
FROM T1  RIGHT JOIN T2
ON T1.key=T2.key
WHERE ...


WHERE NOT EXISTS(select null from T2 group by T2.key having count(T2.key)=1)


Если вставить после WHERE (который относиться к UPDATE SET)

UPDATE T1
SET T1.x=T2.y
...
FROM T1  RIGHT JOIN T2
ON T1.key=T2.key
WHERE  NOT EXISTS(select null from T2 group by T2.key having count(T2.key)=1) 
AND ...--(далее остальные условия для UPDATE SET)
16 янв 15, 14:04    [17127666]     Ответить | Цитировать Сообщить модератору
 Re: Обновить поля таблицы из другой связанной таблицы  [new]
ALARMus
Member

Откуда:
Сообщений: 541
Maxx,

Да я посмотрел примеры и ни одного подходящего ([url=]http://msdn.microsoft.com/ru-ru/library/ms188336.aspx[/url])
16 янв 15, 14:09    [17127707]     Ответить | Цитировать Сообщить модератору
 Re: Обновить поля таблицы из другой связанной таблицы  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
1. Почему НОТ если вы прописали having count(T2.key)=1 ?
2. Почему подзапрос в екзист НИКАК не связан с верхней таблицей/набором ?
3. Вот ето -select null from T2 group by T2.key having count(T2.key)=1 ,у вас возращает хоть что нить кроме NULL?
16 янв 15, 14:12    [17127739]     Ответить | Цитировать Сообщить модератору
 Re: Обновить поля таблицы из другой связанной таблицы  [new]
Konst_One
Member

Откуда:
Сообщений: 11538
UPDATE A 
SET A.volume =LTRIM( (select ' ' + t.vol from T2 t where t.[key] = A.[key] for xml path('')) )
FROM T1 A RIGHT JOIN 
              (SELECT C.[key] FROM T2 C GROUP BY C.[key] HAVING Count(*) = 1) B 
        ON A.[key] = B.[key] 
WHERE A.cond='YES';


страдалец, держи
16 янв 15, 14:17    [17127795]     Ответить | Цитировать Сообщить модератору
 Re: Обновить поля таблицы из другой связанной таблицы  [new]
ALARMus
Member

Откуда:
Сообщений: 541
Maxx
1. Почему НОТ если вы прописали having count(T2.key)=1 ?

Это ошибся
having count(T2.key)<>1

или без NOT
having count(T2.key)=1


Maxx
2. Почему подзапрос в екзист НИКАК не связан с верхней таблицей/набором ?

Вот это для меня загадка как сделать, о чем я собственно пытаюсь узнать тут - как правильно


Maxx
3. Вот ето -select null from T2 group by T2.key having count(T2.key)=1 ,у вас возращает хоть что нить кроме NULL?

Да только NULL (разное количество для = и для <> )
16 янв 15, 14:40    [17128016]     Ответить | Цитировать Сообщить модератору
 Re: Обновить поля таблицы из другой связанной таблицы  [new]
ALARMus
Member

Откуда:
Сообщений: 541
Konst_One,

Спасибо.
UPDATE A 
SET A.volume =LTRIM( (select ' ' + t.vol from T2 t where t.[key] = A.[key] for xml path('')) )
FROM T1 A RIGHT JOIN 
              (SELECT C.[key] FROM T2 C GROUP BY C.[key] HAVING Count(*) = 1) B 
        ON A.[key] = B.[key] 
WHERE A.cond='YES';


Теперь после RIGHT JOIN не вся "таблица", а только поле KEY из нее и потому в вышестоящем SET t.vol не определен.
16 янв 15, 14:55    [17128163]     Ответить | Цитировать Сообщить модератору
 Re: Обновить поля таблицы из другой связанной таблицы  [new]
Konst_One
Member

Откуда:
Сообщений: 11538
согласно вашим данным и требованиям всё работает. если у вас что-то не так, значит исходные данные у вас не те, что вы предоставили ранее
16 янв 15, 15:02    [17128229]     Ответить | Цитировать Сообщить модератору
 Re: Обновить поля таблицы из другой связанной таблицы  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
ALARMus,

Ну не знаю.. у меня работает вариант Konst_One
Если у вас нет - то вы опять что-то недоговорили,не указали ...етц
declare @t2 table ([key] int, vol varchar(1))
declare @t1 table ([key] int, cond varchar(3), volume text)

insert into @t1 ([key], cond, volume)
select 5, 'YES', 'ABC'
union all
select 6, 'YES', 'ABC'
union all
select 8, 'YES', 'ABC'
union all
select 9, 'NO', 'V B'
union all
select 7, 'NO', 'B V'

insert into @t2 ([key], vol)
select 1, 'U'
union all
select 1, 'V'
union all
select 5, 'Q'
union all
select 5, 'W'
union all
select 6, 'A'
union all
select 6, 'S'
union all
select 6, 'D'
union all
select 8, 'Z'


select * from @t1


select ' ' + t.vol
from @t2 t
where 
	t.[key] = 5
for xml path('')


UPDATE A 
SET A.volume=''
FROM @T1 A RIGHT JOIN @t2 B ON A.[key] = B.[key]
WHERE A.cond='YES';


UPDATE A 
SET A.volume = LTRIM(CONVERT(varchar(max), A.volume) + ' ' +(select ' ' + t.vol from @t2 t where t.[key] = A.[key] for xml path('')))
FROM @T1 A 
RIGHT JOIN (SELECT C.[key] FROM @T2 C GROUP BY C.[key] HAVING Count(*) = 1)  B ON A.[key] = B.[key] 
WHERE A.cond='YES';




select * from @t1
16 янв 15, 15:04    [17128240]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить