2015-09-17 2 views
-2

У меня есть 3 таблицы:Как НЕ РЕГИСТРИРУЙТЕСЬ но клей или сшить три таблицы в SQL Server

Clients стол:

ID  Name 
1  ClientName1 
2  ClientName2 
3  ClientName3 

Каждый клиент может иметь некоторые документы, удостоверяющие личность

Таблица Documents:

ID  ClientId   Document 
1  1     ClientDocument11 
2  1     ClientDocument21 
3  1     ClientDocument31 

4  2     ClientDocument12 
5  2     ClientDocument22 

6  3     ClientDocument13 

Также у каждого клиента могут быть банковские счета

Таблица Accounts:

ID  ClientId   Account 
1  1     110000000000 

2  2     120000000000 
3  2     220000000000 

4  3     130000000000 
5  3     230000000000 
6  3     330000000000 

Я хочу НЕ РЕГИСТРИРУЙТЕСЬ но клей или сшить стол Documents к столу Clients, а затем добавить таблицу Account получить таблицу, как это:

ID  Name    Document    Account 
1  ClientName1   ClientDocument11  110000000000 
1  ClientName1   ClientDocument21  110000000000 
1  ClientName1   ClientDocument31  110000000000 

2  ClientName2   ClientDocument12  120000000000 
2  ClientName2   ClientDocument22  220000000000 

3  ClientName3   ClientDocument13  130000000000 
3  ClientName3   ClientDocument13  230000000000 
3  ClientName3   ClientDocument13  330000000000 

ИЛИ

ID  Name    Document    Account 
1  ClientName1   ClientDocument11  110000000000 
1       ClientDocument21  
1       ClientDocument31  

2  ClientName2   ClientDocument12  120000000000 
2       ClientDocument22  220000000000 

3  ClientName3   ClientDocument13  130000000000 
3            230000000000 
3            330000000000 

Если вы посмотрите на строки с Client2 вы понимаете, что это не может achive с JOIN:

2  ClientName2   ClientDocument12  120000000000 
2  ClientName2   ClientDocument22  220000000000 

Можно ли в SQL Server?

+0

Без присоединения не возможно –

+0

Вы хотите изменить таблицу счетов и вставить записи или просто результирующий набор? – Kaf

+1

То, что вы хотите, называется JOIN, нравится вам это или нет. Как вы показываете, это зависит от пользовательского интерфейса. –

ответ

2

Это можно сделать с помощью SQL, но это немного боль. Основная идея заключается в том, чтобы назначить номера строк документов и счетов (начиная с 1 для каждого клиента), а затем, чтобы сделать полное внешнее соединение, подключив идентификатор клиента и номер строки:

select c.Id, c.Name, t.Document, t.Account 
from Clients c 
join (
    select coalesce(d.ClientId, a.ClientId) as ClientId, 
    coalesce(d.Line, a.Line) as Line, 
    d.Document, a.Account 
    from (
    select ClientId, Document, 
     row_number() over (partition by ClientId order by Document) as Line 
    from Documents 
) d 
    full outer join (
    select ClientId, Account, 
     row_number() over (partition by ClientId order by Account) as Line 
    from Accounts 
) a on d.ClientId = a.ClientId and d.Line = a.Line 
) t on c.Id = t.ClientId 
order by c.Id, t.Line; 

См fiddle.

+0

'FULL JOIN' отлично работает, но если у вас есть более 2-3 таблиц, чтобы присоединиться к такому способу, это быстро становится уродливым и медленным. Вы можете найти мой ответ на аналогичный вопрос полезным: http://stackoverflow.com/questions/27515577/best-way-to-glue-columns-together/27523439#27523439 –

+0

Спасибо, Кодо и Владимир Баранов! – okpast

Смежные вопросы