Представление SQL с данными из двух таблиц - PullRequest
0 голосов
/ 13 июня 2010

Я не могу это взломать - у меня есть две таблицы (Persons и Companies), и я пытаюсь создать представление, которое:

  1. показывает всех лиц

  2. также возвращает компании один раз, независимо от того, сколько людей связано с ней

  3. заказы по именам в обеих таблицах

Для пояснения, некоторые примеры данных:

(Table: Companies)
Id  Name
 1  Banana
 2  ABC Inc.
 3  Microsoft
 4  Bigwig

(Table: Persons)
Id  Name      RelatedCompanyId
 1  Joe Smith 3
 2  Justin    
 3  Paul Rudd 4
 4  Anjolie
 5  Dustin    4

Вывод, который я ищу, выглядит примерно так:

 Name      PersonName CompanyName RelatedCompanyId
 ABC Inc.  NULL       ABC Inc.    NULL
 Anjolie   Anjolie    NULL        NULL
 Banana    NULL       Banana      NULL
 Bigwig    NULL       Bigwig      NULL
 Dustin    Dustin     Bigwig      4
 Joe Smith Joe Smith  Microsoft   3
 Justin    Justin     NULL        NULL
 Microsoft NULL       Microsoft   NULL
 Paul Rudd Paul Rudd  Bigwig      4

Как видите, новый столбец «Имя» упорядочен по обеим таблицам (названия компаний отображаются правильно между именами сотрудников), и каждая компания отображается ровно один раз, независимо от того, сколько людей связано с ней.

Может ли это быть даже сделано в SQL ?! Постскриптум Я пытаюсь создать представление, чтобы потом использовать его для удобного поиска данных, полнотекстовой индексации и упростить программирование, просто запросив представление.

1 Ответ

1 голос
/ 13 июня 2010

Вот один из способов:

select * from (
    select Name, null as PersonName, Name as CompanyName, null as RelatedCompanyID
    from Companies
    union
    select Persons.Name as Name, Persons.Name as PersonName, Companies.Name as CompanyName, RelatedCompanyID
    from Persons
    left join Companies on Persons.RelatedCompanyID = Companies.ID
) as AggregatedData
order by AggregatedData.Name

Или чуть более читабельно с обычным табличным выражением, хотя в этом случае нет другого реального преимущества:

with AggregatedData as (
    select Name, null as PersonName, Name as CompanyName, null as RelatedCompanyID
    from Companies
    union 
    select Persons.Name as Name, Persons.Name as PersonName, Companies.Name as CompanyName, RelatedCompanyID
    from Persons
    left join Companies on Persons.RelatedCompanyID = Companies.ID
)
select * from AggregatedData
order by AggregatedData.Name
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...