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

Откуда:
Сообщений: 12
Подскажите пожалуйста, как правильно связать три таблицы.

Исходные данные: есть три таблицы: tabl1, tabl2, tabl3, связанные между собой полседовательно ключевыми полями (tabl1 - tabl2 - tabl3).
Задача: обновить одно из полей (например: field_for_repl) в таблице tabl3, значением некоторого поля из таблицы tabl1 (Например: field_from_repl).




например:

--UPDATE tabl3 SET tabl3.field_for_repl = tabl1.field_from_repl

--FROM tabl3 INNER JOIN tabl2 ON
--tabl3.field_key1 = tabl2.field_key2
--FROM tabl2 INNER JOIN tabl1 ON
--tabl2.a_payer = tabl1.field_key3

Понимаю, что синтаксис не верный, но суть вопроса видна.
Очень прошу помочь, тк по поиску удалось найти различные варианты объединения 2-х таблиц, а проимеров по моей проблеме найти не удалось...(((
20 июл 11, 05:45    [10997824]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно связать последовательно три таблицы  [new]
angel_zar
Member

Откуда: Барнаул
Сообщений: 902
Ну направление вобщем то правильное, только зачем куча FROM
declare @t table (t1 int, t2 char(5))
declare @t1 table (t1 int, t2 char(5))

insert @t
values (1,'qq')


insert @t1
values (1,'qq1')

Update t1
set t1.t1=10
from @t as t1 inner join @t1 as t2 on t1.t1=t2.t1

select * from @t
20 июл 11, 08:15    [10997914]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно связать последовательно три таблицы  [new]
aleksey_khab
Member

Откуда:
Сообщений: 12
Иван, благодарю за поддержку.
Но к моему стыду, мне не хватает компетенции, чтобы применить ваш комментарий к своему вопросу.
Если "направление все-таки верное", почему Ваш код так сильно отличается от моего предположения?
20 июл 11, 09:07    [10998044]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно связать последовательно три таблицы  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
aleksey_khab,

потому что правильный синтаксис отличается от вашего, вы же сами сказали что знаете что у вас непарвильный синтаксис.
самы простой способ поднять "уровень компетенции" по этому вопросу, это заглянуть сюда Обновление данных с использованием данных из других таблиц
20 июл 11, 09:13    [10998063]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно связать последовательно три таблицы  [new]
DENIS_CHEL
Member

Откуда:
Сообщений: 23097
aleksey_khab
Иван, благодарю за поддержку.


Потому что у Ивана не было ваших трех таблиц заполненных тестовыми данными, не?:)
20 июл 11, 09:14    [10998067]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно связать последовательно три таблицы  [new]
aleksey_khab
Member

Откуда:
Сообщений: 12
Черт, роднинькие мои, ну не хватает у меня тяму понять как строиться логика запроса)))

Ну нарисуйте плиз, как будет выглядеть код на основе данных из моего примера. (((

В примере angel_zar мне не понятно, почему
"set t1.t1=10", откуда взялась десятка, мне же надо присвоить значение другого поля другой таблицы

В ссылке на пример SomewhereSomehow
вообще запутался где таблицы, где поля.

Понял что должна быть привязка "as" , но как правильно написать?

Не бросайте в беде!!!)))
20 июл 11, 10:40    [10998573]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно связать последовательно три таблицы  [new]
iap
Member

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

UPDATE tabl3
SET tabl3.field_for_repl = tabl1.field_from_repl 
FROM tabl3
JOIN tabl2 ON tabl3.field_key1 = tabl2.field_key2
JOIN tabl1 ON tabl2.a_payer = tabl1.field_key3;
Надо обеспечить соответствие ОДНОЙ записи tabl1 для КАЖДОЙ записи tabl3
Иначе результат UPDATEа не определён (так сказано в BOL)
20 июл 11, 10:48    [10998623]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно связать последовательно три таблицы  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31986
aleksey_khab
В примере angel_zar мне не понятно, почему
"set t1.t1=10", откуда взялась десятка, мне же надо присвоить значение другого поля другой таблицы
Вместо десятки напишите другое поле другой таблицы.
aleksey_khab
Понял что должна быть привязка "as" , но как правильно написать?
as указывает краткий алиас таблицы. Это нужно, чтобы покороче писать и чтоб отличать разные экзеспляры одной таблицы.

aleksey_khab
В ссылке на пример SomewhereSomehow
вообще запутался где таблицы, где поля.
А там просто примеры неправильные, хоть это и БОЛ :-)

И это хорошая иллюстрация того, что получается, если не использовать алиасы - вместо того, чтобы скользнуть взглядом по коду и моментально всё понять, приходится долго изучать модель данных.

Вместо
UPDATE Sales.SalesPerson
SET SalesYTD = SalesYTD + SubTotal
FROM Sales.SalesPerson AS sp
JOIN Sales.SalesOrderHeader AS so
    ON sp.BusinessEntityID = so.SalesPersonID
    AND so.OrderDate = (SELECT MAX(OrderDate)
                        FROM Sales.SalesOrderHeader
                        WHERE SalesPersonID = sp.BusinessEntityID);
нужно писать
UPDATE sp
SET sp.SalesYTD = sp.SalesYTD + so.SubTotal
FROM Sales.SalesPerson AS sp
    JOIN Sales.SalesOrderHeader AS so
        ON sp.BusinessEntityID = so.SalesPersonID
        AND so.OrderDate = (SELECT MAX(sh.OrderDate)
                        FROM Sales.SalesOrderHeader sh
                        WHERE sh.SalesPersonID = sp.BusinessEntityID);
aleksey_khab
где таблицы, где поля
После слов UPDATE, и JOIN таблицы, в остальных местах поля
20 июл 11, 10:49    [10998625]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно связать последовательно три таблицы  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
iap
aleksey_khab,

UPDATE tabl3
SET tabl3.field_for_repl = tabl1.field_from_repl 
FROM tabl3
JOIN tabl2 ON tabl3.field_key1 = tabl2.field_key2
JOIN tabl1 ON tabl2.a_payer = tabl1.field_key3;
Надо обеспечить соответствие ОДНОЙ записи tabl1 для КАЖДОЙ записи tabl3
Иначе результат UPDATEа не определён (так сказано в BOL)
Можно алиасы применить (рекомендуется):
UPDATE t3
SET t3.field_for_repl = t1.field_from_repl 
FROM tabl3 t3
JOIN tabl2 t2 ON t3.field_key1 = t2.field_key2
JOIN tabl1 t1 ON t2.a_payer = t1.field_key3;
20 июл 11, 10:50    [10998646]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно связать последовательно три таблицы  [new]
aleksey_khab
Member

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

UPDATE tabl3
SET tabl3.field_for_repl = tabl1.field_from_repl 
FROM tabl3
JOIN tabl2 ON tabl3.field_key1 = tabl2.field_key2
JOIN tabl1 ON tabl2.a_payer = tabl1.field_key3;
Надо обеспечить соответствие ОДНОЙ записи tabl1 для КАЖДОЙ записи tabl3
Иначе результат UPDATEа не определён (так сказано в BOL)
Можно алиасы применить (рекомендуется):
UPDATE t3
SET t3.field_for_repl = t1.field_from_repl 
FROM tabl3 t3
JOIN tabl2 t2 ON t3.field_key1 = t2.field_key2
JOIN tabl1 t1 ON t2.a_payer = t1.field_key3;


Все стало понятно, спасибо други!!! С меня пиво)
только вот в этом примере в пред-предпоследней строчке "FROM tabl3 t3" разве AS не пропустили? эли это не обязательный параметр?
20 июл 11, 10:59    [10998724]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно связать последовательно три таблицы  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31986
aleksey_khab
только вот в этом примере в пред-предпоследней строчке "FROM tabl3 t3" разве AS не пропустили? эли это не обязательный параметр?
необязательное ключевое слово.
20 июл 11, 10:59    [10998731]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно связать последовательно три таблицы  [new]
aleksey_khab
Member

Откуда:
Сообщений: 12
Всем низкий поклон! Перевел код на свои данные - работает (а как же))) )
Сейчас буду проверять результаты и строить новые связки...
20 июл 11, 11:09    [10998803]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно связать последовательно три таблицы  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
aleksey_khab
iap
пропущено...
Можно алиасы применить (рекомендуется):
UPDATE t3
SET t3.field_for_repl = t1.field_from_repl 
FROM tabl3 t3
JOIN tabl2 t2 ON t3.field_key1 = t2.field_key2
JOIN tabl1 t1 ON t2.a_payer = t1.field_key3;


Все стало понятно, спасибо други!!! С меня пиво)
только вот в этом примере в пред-предпоследней строчке "FROM tabl3 t3" разве AS не пропустили? эли это не обязательный параметр?
А про INNER чего-то не спрашиваете!
20 июл 11, 11:09    [10998812]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно связать последовательно три таблицы  [new]
aleksey_khab
Member

Откуда:
Сообщений: 12
Кстате, правильное замечание! Обращал конечно внимание, но потом пропустил. Так как быть с "inner"-ом? ))
И еще, если надо задать условие "Where tabl3.field_for_repl is not null", где его правильно вставить?
20 июл 11, 11:14    [10998863]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно связать последовательно три таблицы  [new]
aleksey_khab
Member

Откуда:
Сообщений: 12
aleksey_khab
И еще, если надо задать условие "Where tabl3.field_for_repl is not null", где его правильно вставить?


просто дописать в конце кода?
20 июл 11, 11:17    [10998889]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно связать последовательно три таблицы  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31986
aleksey_khab
aleksey_khab
И еще, если надо задать условие "Where tabl3.field_for_repl is not null", где его правильно вставить?


просто дописать в конце кода?
Да.
20 июл 11, 11:19    [10998896]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно связать последовательно три таблицы  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
aleksey_khab
Кстате, правильное замечание! Обращал конечно внимание, но потом пропустил. Так как быть с "inner"-ом? ))
И еще, если надо задать условие "Where tabl3.field_for_repl is not null", где его правильно вставить?
SELECT (Transact-SQL)
Предложение FROM (Transact-SQL)
INNER
Указывает, что возвращаются все совпадающие пары строк. Отмена несовпадающих строк из обеих таблиц. Если тип соединения не указан, этот тип задается по умолчанию.
20 июл 11, 11:19    [10998902]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить