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

Откуда:
Сообщений: 19
Мне надо написать запрос каторый соединит дание трех таблиц,например

Customer
==========
CustomerCode    CustomerName
--------------   ---------------
1	          Customer1
		
Contacts
===========
CustomerCode   ContactCode   ContactName
--------------  -------------  ------------- 
1            	1	     Name1
1	        2	     Name2
		
Address
=======		
CustomerCode	   AddressCode	    AddressName
--------------    --------------    -----------------
1	            100	               Name1
1	            300	               Name3
1	            400	               Name4
1	            500	               Name5

и результат который мне надо получить
CustomerCode   ContactCode   ContactName    AddressCode   AddressName  CustomerName
-------------- ------------ ------------- ------------   ------------  --------------
1                     1         Name1           100           Name1      Customer1
1                     2         Name2           NULL          NULL       Customer1
1                    NULL        NULL           300           Name3      Customer1
1                    NULL        NULL           400           Name4      Customer1
1                    NULL        NULL           500           Name5      Customer1

если Contacts.ContactName=Address.AdressName то показать только одну строку, в обратном случае результат из таблиц Contacts и Address

СПАСИБО ЗА ПОМОЩЬ !!!
12 ноя 11, 00:56    [11586032]     Ответить | Цитировать Сообщить модератору
 Re: помогите написать запрос для 3 таблиц  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22550
Совершенно непонятная постановка задачи
Контакт - это обычно что-то типа "Иванов Иван Иванович"
Адрес - это обычно что-то типа "ул. Пушкина 5, кв.18"
Как они могут быть равны?
12 ноя 11, 01:02    [11586051]     Ответить | Цитировать Сообщить модератору
 Re: помогите написать запрос для 3 таблиц  [new]
VovaH
Member

Откуда:
Сообщений: 19
У каждого адреса есть имя (в дополнение к улице,дом, индекс) и в некоторих случаях AddressName ='Иванов Иван Иванович'
12 ноя 11, 01:11    [11586081]     Ответить | Цитировать Сообщить модератору
 Re: помогите написать запрос для 3 таблиц  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22550
Что за бред?
- Вы где прописаны?
- По адресу "Иванов И.И."


----------------------------------------------------------------------
По тестовым данным и желаемому результату - похоже Вам нужен FULL JOIN таблиц Address и Contacts
результат взять в скобки (derived table) и при-join-ить таблицу Customer
12 ноя 11, 01:35    [11586186]     Ответить | Цитировать Сообщить модератору
 Re: помогите написать запрос для 3 таблиц  [new]
VovaH
Member

Откуда:
Сообщений: 19
Я пробовал FULL JOIN но это не дает мне желаемого результата

Не моглу бы вы предаставить пример

Спасибо
12 ноя 11, 01:47    [11586226]     Ответить | Цитировать Сообщить модератору
 Re: помогите написать запрос для 3 таблиц  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22550
Мне проверить не на чем, пишу из дому с Мандривы, могут быть очепятки вплоть до ошибок синтаксиса
Поэтому проверяйте сами

select C.CustomerCode, F.ContactCode, F.ContactName, F.AddressCode, F.AddressName, C. CustomerName
  from (select T.CustomerCode /* ??? ИЛИ A.CustomerCode ???  */, T.ContactCode, T.ContactName, A.AddressCode, A.AddressName 
          from Contacts T
          full join Address A on A.AddressName = T.ContactName) as F
  join Customer as C on C.CustomerCode = F.CustomerCode
12 ноя 11, 02:18    [11586300]     Ответить | Цитировать Сообщить модератору
 Re: помогите написать запрос для 3 таблиц  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22550
или даже
...isnull(T.CustomerCode, A.CustomerCode) as CustomerCode...
12 ноя 11, 02:20    [11586303]     Ответить | Цитировать Сообщить модератору
 Re: помогите написать запрос для 3 таблиц  [new]
VovaH
Member

Откуда:
Сообщений: 19
Результат не верный.
FULL JOIN не ограничен только для определенного CustomerCode
12 ноя 11, 03:17    [11586330]     Ответить | Цитировать Сообщить модератору
 Re: помогите написать запрос для 3 таблиц  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22550
На Ваших тестовых данных
+
drop table Customer;
create table Customer(CustomerCode int, CustomerName varchar(100));
insert into Customer(CustomerCode, CustomerName) values(1, 'Customer1');

drop table Contacts;
create table Contacts(CustomerCode int, ContactCode int, ContactName varchar(100));
insert into Contacts(CustomerCode, ContactCode, ContactName) values(1, 1, 'Name1');
insert into Contacts(CustomerCode, ContactCode, ContactName) values(1, 2, 'Name2');

drop table Address;
create table Address(CustomerCode int, AddressCode int, AddressName varchar(100));
insert into Address(CustomerCode, AddressCode, AddressName) values(1, 100, 'Name1');
insert into Address(CustomerCode, AddressCode, AddressName) values(1, 300, 'Name3');
insert into Address(CustomerCode, AddressCode, AddressName) values(1, 400, 'Name4');
insert into Address(CustomerCode, AddressCode, AddressName) values(1, 500, 'Name5');

запрос
select C.CustomerCode, F.ContactCode, F.ContactName, F.AddressCode, F.AddressName, C. CustomerName
  from (select ifnull(T.CustomerCode, A.CustomerCode) as CustomerCode, T.ContactCode, T.ContactName, A.AddressCode, A.AddressName 
          from Contacts T
          left join Address A on A.AddressName = T.ContactName
        UNION ALL
        select ifnull(T.CustomerCode, A.CustomerCode) as CustomerCode, T.ContactCode, T.ContactName, A.AddressCode, A.AddressName 
          from Contacts T
          right join Address A on A.AddressName = T.ContactName
          where T.CustomerCode is null) as F
  join Customer as C on C.CustomerCode = F.CustomerCode
выдает у меня на MySQL следующий результат:

К сообщению приложен файл. Размер - 16Kb
12 ноя 11, 15:04    [11586850]     Ответить | Цитировать Сообщить модератору
 Re: помогите написать запрос для 3 таблиц  [new]
VovaH
Member

Откуда:
Сообщений: 19
Если в таблице Address есть запись

CustomerCode   AddressCode      AddressName
--------------  ------------  -------------
2                  100             Name2

то результат запроса будет не верный
14 ноя 11, 19:01    [11595821]     Ответить | Цитировать Сообщить модератору
 Re: помогите написать запрос для 3 таблиц  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22550
А какой он должен быть?
14 ноя 11, 19:17    [11595885]     Ответить | Цитировать Сообщить модератору
 Re: помогите написать запрос для 3 таблиц  [new]
VovaH
Member

Откуда:
Сообщений: 19
CustomerCode   ContactCode   ContactName    AddressCode   AddressName  CustomerName
-------------- ------------ ------------- ------------   ------------  --------------
1                     2         Name2           100       Name2           Customer1
вместо

CustomerCode   ContactCode   ContactName    AddressCode   AddressName  CustomerName
-------------- ------------ ------------- ------------   ------------  --------------
1                     2         Name2           NULL          NULL       Customer1
14 ноя 11, 19:24    [11595920]     Ответить | Цитировать Сообщить модератору
 Re: помогите написать запрос для 3 таблиц  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22550
Я нихчего не понял!

+ новые тестовые данные
use tempdb

drop table Customer;
go
create table Customer(CustomerCode int, CustomerName varchar(20));
insert into Customer(CustomerCode, CustomerName) values(1, 'Customer1');

drop table Contacts;
go
create table Contacts(CustomerCode int, ContactCode int, ContactName varchar(20));
insert into Contacts(CustomerCode, ContactCode, ContactName) values(1, 1, 'Name1');
insert into Contacts(CustomerCode, ContactCode, ContactName) values(1, 2, 'Name2');

drop table Address;
go
create table Address(CustomerCode int, AddressCode int, AddressName varchar(20));
insert into Address(CustomerCode, AddressCode, AddressName) values(1, 100, 'Name1');
insert into Address(CustomerCode, AddressCode, AddressName) values(1, 300, 'Name3');
insert into Address(CustomerCode, AddressCode, AddressName) values(1, 400, 'Name4');
insert into Address(CustomerCode, AddressCode, AddressName) values(1, 500, 'Name5');
insert into Address(CustomerCode, AddressCode, AddressName) values(2, 100, 'Name2');

тот же запрос:
select C.CustomerCode, F.ContactCode, F.ContactName, F.AddressCode, F.AddressName, C. CustomerName
  from (select isnull(T.CustomerCode, A.CustomerCode) as CustomerCode, T.ContactCode, T.ContactName, A.AddressCode, A.AddressName 
          from Contacts T
          left join Address A on A.AddressName = T.ContactName
        UNION ALL
        select isnull(T.CustomerCode, A.CustomerCode) as CustomerCode, T.ContactCode, T.ContactName, A.AddressCode, A.AddressName 
          from Contacts T
          right join Address A on A.AddressName = T.ContactName
          where T.CustomerCode is null) as F
  join Customer as C on C.CustomerCode = F.CustomerCode

выдает результат:
CustomerCode ContactCode ContactName          AddressCode AddressName          CustomerName
------------ ----------- -------------------- ----------- -------------------- --------------------
1            1           Name1                100         Name1                Customer1
1            2           Name2                100         Name2                Customer1
1            NULL        NULL                 300         Name3                Customer1
1            NULL        NULL                 400         Name4                Customer1
1            NULL        NULL                 500         Name5                Customer1

(5 row(s) affected)

что не устраивает?
14 ноя 11, 19:40    [11595970]     Ответить | Цитировать Сообщить модератору
 Re: помогите написать запрос для 3 таблиц  [new]
VovaH
Member

Откуда:
Сообщений: 19
правильный результат

CustomerCode   ContactCode   ContactName    AddressCode   AddressName  CustomerName
-------------- ------------ ------------- ------------   ------------  --------------
1                     2         Name2           NULL          NULL       Customer1


потому что Customer#1 не имеет записи с AddressName= ' Name2'
14 ноя 11, 19:46    [11595993]     Ответить | Цитировать Сообщить модератору
 Re: помогите написать запрос для 3 таблиц  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22550
select C.CustomerCode, F.ContactCode, F.ContactName, F.AddressCode, F.AddressName, C. CustomerName
  from (
  select isnull(T.CustomerCode, A.CustomerCode) as CustomerCode, T.ContactCode, T.ContactName, A.AddressCode, A.AddressName 
          from Contacts T
          full join Address A on A.AddressName = T.ContactName
                             and T.CustomerCode = A.CustomerCode
          ) as F
  join Customer as C on C.CustomerCode = F.CustomerCode


CustomerCode ContactCode ContactName          AddressCode AddressName          CustomerName
------------ ----------- -------------------- ----------- -------------------- --------------------
1            1           Name1                100         Name1                Customer1
1            2           Name2                NULL        NULL                 Customer1
1            NULL        NULL                 300         Name3                Customer1
1            NULL        NULL                 400         Name4                Customer1
1            NULL        NULL                 500         Name5                Customer1

(5 row(s) affected)
14 ноя 11, 20:04    [11596049]     Ответить | Цитировать Сообщить модератору
 Re: помогите написать запрос для 3 таблиц  [new]
VovaH
Member

Откуда:
Сообщений: 19
СПАСИБО !!! То что надо :)
14 ноя 11, 20:19    [11596085]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить