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

Откуда:
Сообщений: 4
Добрый день, подскажите, пожалуйста, как написать Update записей из таблицы 1 значением из таблицы 3 при условии что:
Таблица1 имеет 4 записи, которые связаны с одной записью в Таблице2 и данная запись связанна с 4 записями из таблицы 3.
Картинка с другого сайта.

Спасибо!

К сообщению приложен файл. Размер - 17Kb
25 июн 14, 11:10    [16215723]     Ответить | Цитировать Сообщить модератору
 Re: t-sql Update вопрос!  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
а что на что апдейтить то надо ?
25 июн 14, 11:13    [16215741]     Ответить | Цитировать Сообщить модератору
 Re: t-sql Update вопрос!  [new]
Mikle83
Member

Откуда: Санкт-Петербург
Сообщений: 653
defC,
каким именно значением из таблицы 3 должна быть обновлена "запись 1" в таблице 1 и почему?
25 июн 14, 11:14    [16215751]     Ответить | Цитировать Сообщить модератору
 Re: t-sql Update вопрос!  [new]
defC
Member

Откуда:
Сообщений: 4
Mikle83
defC,
каким именно значением из таблицы 3 должна быть обновлена "запись 1" в таблице 1 и почему?

В Таблице 1 есть поле "Виды расчётов" оно пустое, в Таблице 3 поле "Виды расчётов" заполнено, необходимо сделать апдейт этого поля в Т1 значениями из Т3.
25 июн 14, 11:26    [16215853]     Ответить | Цитировать Сообщить модератору
 Re: t-sql Update вопрос!  [new]
Mikle83
Member

Откуда: Санкт-Петербург
Сообщений: 653
defC
Mikle83
defC,
каким именно значением из таблицы 3 должна быть обновлена "запись 1" в таблице 1 и почему?

В Таблице 1 есть поле "Виды расчётов" оно пустое, в Таблице 3 поле "Виды расчётов" заполнено, необходимо сделать апдейт этого поля в Т1 значениями из Т3.


Это все хорошо, но на вопрос вы так и не ответили.
Еще раз переформулирую: значением из какой записи в таблице 3 должно быть обновлено значение в "записи 1" в таблице 1, и почему?
25 июн 14, 11:28    [16215872]     Ответить | Цитировать Сообщить модератору
 Re: t-sql Update вопрос!  [new]
defC
Member

Откуда:
Сообщений: 4
Mikle83
defC
пропущено...

В Таблице 1 есть поле "Виды расчётов" оно пустое, в Таблице 3 поле "Виды расчётов" заполнено, необходимо сделать апдейт этого поля в Т1 значениями из Т3.


Это все хорошо, но на вопрос вы так и не ответили.
Еще раз переформулирую: значением из какой записи в таблице 3 должно быть обновлено значение в "записи 1" в таблице 1, и почему?

Запись 1 в таблице 1 = Записи 1 из таблицы 3
Запись 2 в таблице 1 = Записи 2 из таблицы 3
Запись 3 в таблице 1 = Записи 3 из таблицы 3
Запись 4 в таблице 1 = Записи 4 из таблицы 3
Документ не может быть с пустым полем, по этому необходимо его заполнять, т.е. Таблица1.ВидыРасчетов <> 0
Количество записей в таблицах 1 и 3 всегда одинаковое.
25 июн 14, 11:44    [16216071]     Ответить | Цитировать Сообщить модератору
 Re: t-sql Update вопрос!  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31964
defC
Запись 1 в таблице 1 = Записи 1 из таблицы 3
Запись 2 в таблице 1 = Записи 2 из таблицы 3
Запись 3 в таблице 1 = Записи 3 из таблицы 3
Запись 4 в таблице 1 = Записи 4 из таблицы 3
Документ не может быть с пустым полем, по этому необходимо его заполнять, т.е. Таблица1.ВидыРасчетов <> 0
Количество записей в таблицах 1 и 3 всегда одинаковое.
Пронумеровать в нужно порядке, используя оконные функции, и проапдейтить.

Напишите скрипт с примером данных, и укажите версию, тогда вам помогут запросом.
25 июн 14, 11:48    [16216120]     Ответить | Цитировать Сообщить модератору
 Re: t-sql Update вопрос!  [new]
Artny
Guest
У сервера нет понятия "первая запись", точнее чтобы оно появилось вам надо задать какой то порядок явно, order by по какому то полю таблицы 3. Только после этого можно научить сервер определять "первую запись".
В вашем случае у вас есть просто 4 записи из таблицы3, соответствующие одной записи из таблицы1. Определитесь сами, которая из них первая, и намекните об этом серверу с помощью "order by".
25 июн 14, 11:49    [16216137]     Ответить | Цитировать Сообщить модератору
 Re: t-sql Update вопрос!  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4902
Не вижу тут ничего сложного. Надо написать UPDATE с FROM, в котором присутствую JOIN и агрегирующий подзапрос, собирающий несколько записей в одну.
25 июн 14, 12:11    [16216396]     Ответить | Цитировать Сообщить модератору
 Re: t-sql Update вопрос!  [new]
Mikle83
Member

Откуда: Санкт-Петербург
Сообщений: 653
a_voronin
Не вижу тут ничего сложного. Надо написать UPDATE с FROM, в котором присутствую JOIN и агрегирующий подзапрос, собирающий несколько записей в одну.

Забавно. И в итоге в таблице 1 у вас получатся одинаковые значения для всех записей, завязанных на одну в таблице 2.
Не уверен, что именно это необходимо ТСу.


ТС - может есть какое-то доп. поле по которому можно связать таблицу 1 и таблицу 2?
К примеру, дата?
25 июн 14, 12:43    [16216808]     Ответить | Цитировать Сообщить модератору
 Re: t-sql Update вопрос!  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4902
Mikle83
a_voronin
Не вижу тут ничего сложного. Надо написать UPDATE с FROM, в котором присутствую JOIN и агрегирующий подзапрос, собирающий несколько записей в одну.

Забавно. И в итоге в таблице 1 у вас получатся одинаковые значения для всех записей, завязанных на одну в таблице 2.
Не уверен, что именно это необходимо ТСу.


ТС - может есть какое-то доп. поле по которому можно связать таблицу 1 и таблицу 2?
К примеру, дата?



Вот пример синтаксиса, который я имел ввиду
UPDATE c
SET c.Rating = r.Rating
FROM Companies c
JOIN (SELECT AVG(Rating) Rating, CompID FROM Ratings GROUP BY CompId) r
  ON c.CompanyId = r.CompId


    UPDATE J
    SET J.StatusID = A.statusId
    FROM MKT_JobOrder J INNER JOIN (
       SELECT J.JobOrderID, 
         CASE WHEN SUM(DUV.VendorDUQuantity) = SUM(RD.InvoiceQuantity) 
            THEN 1 ELSE J.StatusID 
         END As statusId
            PLN_DU_Vendor DUV
        INNER JOIN ENG_Release R ON R.ReleaseID = DUV.ReleaseID
        INNER JOIN ENG_DU_Header H ON H.ReleaseID = R.ReleaseID AND DUV.DUID = H.DUID
        INNER JOIN MKT_JobOrder J ON J.JobOrderID = R.JobOrderID
        INNER JOIN MKT_CustomerOrder CO ON CO.OrderID = J.OrderID
        LEFT JOIN PMT_RFDHeader RH ON RH.JobOrderID = J.JobOrderID
        LEFT JOIN PMT_RFDDetail RD ON RD.RFDID = RH.RFDID AND RD.DUID = DUV.DUID                 
    WHERE 
            CO.OrderID = 100
    GROUP BY 
            J.JobOrderID, J.StatusID  ) A ON J.JobOrderID = A.JobOrderID


Группировать по ключу от первой таблицы
25 июн 14, 13:14    [16217059]     Ответить | Цитировать Сообщить модератору
 Re: t-sql Update вопрос!  [new]
defC
Member

Откуда:
Сообщений: 4
Mikle83
a_voronin
Не вижу тут ничего сложного. Надо написать UPDATE с FROM, в котором присутствую JOIN и агрегирующий подзапрос, собирающий несколько записей в одну.

Забавно. И в итоге в таблице 1 у вас получатся одинаковые значения для всех записей, завязанных на одну в таблице 2.
Не уверен, что именно это необходимо ТСу.


ТС - может есть какое-то доп. поле по которому можно связать таблицу 1 и таблицу 2?
К примеру, дата?


У меня даже с Select проблема:
В БД есть таблица t$BaseFin в ней очень много записей, я её фильтрую:
Select bf.f$nrec
From T$BASEFIN bf
Where 0x800100000000B7C1 = bf.F$CPLPOR -- (0x800100000000B7C1 – это ID)
and   1                  = bf.F$DIRECT -- Фильтр по направлению (продажа)

В результате Select выдаёт мне 4 записи из БД. Далее есть таблица t$Oborot в которой тоже очень много записей, после филтра:
Select o.f$nrec
From T$OBOROT o
Where 0x800100000000B7C1 = o.F$CSOPRDOC 
and   70                 = o.F$TIDKGAL -- фильтр 

Результат 4 записиси из БД. Далее всё объеденяю в один Select:
Select bf.F$NREC, o.F$NREC
From T$BASEFIN bf, T$OBOROT o
Where 0x800100000000B7C1 = bf.F$CPLPOR
and   1                  = bf.F$DIRECT
and   bf.F$CPLPOR        = o.F$CSOPRDOC
and   70                 = o.F$TIDKGAL

В результате 16 записей (4 из t$oborot * 4 из t$basefin), скажите, пожалуйста, как сделать чтобы мне вывело только 4 записи из t$oborot и 4 записи из t$baseFin?
Первый 2й день занимаюсь t-Sql, не пинайте сильно.
25 июн 14, 13:15    [16217068]     Ответить | Цитировать Сообщить модератору
 Re: t-sql Update вопрос!  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
defC
пожалуйста, как сделать чтобы мне вывело только 4 записи из t$oborot и 4 записи из t$baseFin?
Задать условие соответствия одной записи из t$oborot другой записи из t$basefin.
25 июн 14, 13:27    [16217151]     Ответить | Цитировать Сообщить модератору
 Re: t-sql Update вопрос!  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4902
defC
Mikle83
пропущено...

Забавно. И в итоге в таблице 1 у вас получатся одинаковые значения для всех записей, завязанных на одну в таблице 2.
Не уверен, что именно это необходимо ТСу.


ТС - может есть какое-то доп. поле по которому можно связать таблицу 1 и таблицу 2?
К примеру, дата?


У меня даже с Select проблема:
В БД есть таблица t$BaseFin в ней очень много записей, я её фильтрую:
Select bf.f$nrec
From T$BASEFIN bf
Where 0x800100000000B7C1 = bf.F$CPLPOR -- (0x800100000000B7C1 – это ID)
and   1                  = bf.F$DIRECT -- Фильтр по направлению (продажа)

В результате Select выдаёт мне 4 записи из БД. Далее есть таблица t$Oborot в которой тоже очень много записей, после филтра:
Select o.f$nrec
From T$OBOROT o
Where 0x800100000000B7C1 = o.F$CSOPRDOC 
and   70                 = o.F$TIDKGAL -- фильтр 

Результат 4 записиси из БД. Далее всё объеденяю в один Select:
Select bf.F$NREC, o.F$NREC
From T$BASEFIN bf, T$OBOROT o
Where 0x800100000000B7C1 = bf.F$CPLPOR
and   1                  = bf.F$DIRECT
and   bf.F$CPLPOR        = o.F$CSOPRDOC
and   70                 = o.F$TIDKGAL

В результате 16 записей (4 из t$oborot * 4 из t$basefin), скажите, пожалуйста, как сделать чтобы мне вывело только 4 записи из t$oborot и 4 записи из t$baseFin?
Первый 2й день занимаюсь t-Sql, не пинайте сильно.



Может вам книжку простенькую почитать, рекомендую http://kpnemo.ws/ebook/2012/09/06/SQL_zaprosyi_dlya_prostyih_smertnyih/
25 июн 14, 14:05    [16217381]     Ответить | Цитировать Сообщить модератору
 Re: t-sql Update вопрос!  [new]
Mikle83
Member

Откуда: Санкт-Петербург
Сообщений: 653
defC
Select bf.F$NREC, o.F$NREC
From T$BASEFIN bf, T$OBOROT o
Where 0x800100000000B7C1 = bf.F$CPLPOR
and   1                  = bf.F$DIRECT
and   bf.F$CPLPOR        = o.F$CSOPRDOC
and   70                 = o.F$TIDKGAL

В результате 16 записей (4 из t$oborot * 4 из t$basefin), скажите, пожалуйста, как сделать чтобы мне вывело только 4 записи из t$oborot и 4 записи из t$baseFin?
Первый 2й день занимаюсь t-Sql, не пинайте сильно.


Вполне ожидаемое поведение.
Пока что у вас условие выбора записи из второй таблицы такое: берем запись из первой таблицы и [все записи из второй с таким же ИД => для каждой записи из первой таблицы выбираются 4 записи из второй.

Как бэ 4*4 = 16 получается.

Если вам необходимо получить только 4 записи, вы должны составить уникальное условие для каждой из четырех записей в первой таблице. Условие, по которому будет соответствовать одна и только одна запись во второй таблице. После того, как условие сформулируете - его уже можно будет попробовать реализовать в SQL...
25 июн 14, 15:25    [16217981]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить