Можете ли вы вернуть разные значения для нескольких строк в одном соединении? - PullRequest
1 голос
/ 10 марта 2011

У меня есть две таблицы:

Информация о родителе

Информация о ребенке

оба структурированы (почти) одинаково с несколькими нюансами.

Структура таблиц следующая:

Родитель

ID   |   First   |   Last   |   DOB       |   Address
-------------------------------------------------
1    |   John    |   Doe    | 1980-01-01  |   123 street

Зависимые

ParentID   |    Type   |    First   |   Last    |    DOB
--------------------------------------------------
1    |   Spouse  |    Jane    |    Doe    |   1981-02-01
1    |   Child   |    Mike    |    Doe    |   1999-08-01
1    |   Child   |    Zoe     |    Doe    |   2002-04-01

Я хочу построить запрос (в идеале один вызов с объединениями, который возвращает следующее:

Таблица результатов

First   |    Last    |    Type    |    DOB        |     Address
---------------------------------------------------------------- 
John    |    Doe     |    Parent  |  1980-01-01   |   123 Street
Jane    |    Doe     |    Spouse  |  1981-02-01   |   123 Street
Mike    |    Doe     |   Child    |  1999-08-01   |   123 street
Zoe     |    Doe     |   Child    |  2002-04-01   |   123 Street

Полагаю, я мог бы построить исходный подзапрос с помощью LEFT JOIN для таблицы зависимостей (не у всех родителей есть иждивенцы), а затем выполнить первичный запрос, который фильтрует эту таблицу, однако - когда я это делаю, запрос занимает более минуты производить. (мои таблицы меняются сотни раз в день, поэтому сохранить индекс таблиц на самом деле не вариант, так как мне придется постоянно перестраивать).

UPDATE

Чем больше я думаю об этом, даже левое соединение не будет работать обязательно, потому что родительская информация и первый набор зависимой информации будут находиться в одной строке подзапроса (и, в свою очередь, сделают «невозможным» первичный запрос для фильтровать одну строку на несколько).

Есть идеи?

1 Ответ

1 голос
/ 10 марта 2011
SELECT t.First, t.Last, t.Type, t.DOB, t.Address
    FROM (SELECT ID, First, Last, 'Parent' as Type, DOB, Address, 1 as SortKey
             FROM Parent
          UNION ALL
          SELECT p.ID, d.First, d.Last, d.Type, d.DOB, p.Address, 
                 CASE WHEN d.Type = 'Spouse' THEN 2 ELSE 3 END as SortKey
              FROM Dependents d
                  INNER JOIN Parent p
                      ON d.ParentID = p.ID) t
    ORDER BY t.ID, t.SortKey
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...