Объединение таблиц в SQL, где имя нового столбца основано на значении объединенной таблицы из другого столбца - PullRequest
0 голосов
/ 18 января 2019

У меня есть 2 таблицы, и я пытаюсь объединить содержимое второй таблицы с первой. По сути, я хочу получить список элементов, который содержит все поля из первой таблицы и все соответствующие строки во второй таблице, имена после содержимого столбца во второй таблице.

Таблица A

+----+--------+---------------------+--------+
| ID | Title  |        Date         | Etc... |
+----+--------+---------------------+--------+
|  1 | QWERTY | 0000-00-00:00:00:00 |    ... |
|  2 | TEST   | 0000-00-00:00:00:00 |    ... |
|  3 | ASDF   | 0000-00-00:00:00:00 |    ... |
|  4 | IOP    | 0000-00-00:00:00:00 |    ... |
+----+--------+---------------------+--------+

Таблица B

+----+------------+------+------------+
| ID | Table_A_ID | Key  |   Value    |
+----+------------+------+------------+
|  1 |          1 | Name | John       |
|  2 |          2 | Name | Brad       |
|  3 |          1 | DOB  | 2000-01-16 |
+----+------------+------+------------+

Так что я хотел бы иметь возможность выбрать * из таблицы A и каким-то образом получить следующее

+----+--------+---------------------+--------+------+------------+
| ID | Title  |        Date         | Etc... | Name |    DOB     |
+----+--------+---------------------+--------+------+------------+
|  1 | QWERTY | 0000-00-00:00:00:00 |    ... | John | 2000-01-16 |
|  2 | TEST   | 0000-00-00:00:00:00 |    ... | Brad |            |
|  3 | ASDF   | 0000-00-00:00:00:00 |    ... |      |            |
|  4 | IOP    | 0000-00-00:00:00:00 |    ... |      |            |
+----+--------+---------------------+--------+------+------------+

Ключевым моментом является то, что я не знаю, какими будут ключи

К сожалению, я понятия не имею, как это называется Google, я просматривал внутренние, левые, правые соединения, и, похоже, они не делают то, что я пытаюсь сделать.

Ответы [ 3 ]

0 голосов
/ 18 января 2019

Этого можно достичь с помощью двух JOIN-соединений на TableB, например:

SELECT
    ta.id,
    ta.date,
    ta.etc,
    tb.value Name,
    td.value DOB
FROM
    tableA ta
    INNER JOIN tableB tb ON tb.table_a_id = tb.id AND tb.key = 'Name'
    INNER JOIN tableB td ON td.table_a_id = ta.id AND td.key = 'DOB'

С помощью этого запроса будут отображаться только те записи, которые имеют имя и DOB в таблице B. Если вы хотите избежать фильтрации этих «неполных» записей, вы можете использовать LEFT JOIN вместо INNER JOIN.

0 голосов
/ 18 января 2019

Вы хотите изменить ключевые значения. Вы можете сделать это вручную следующим образом:

select a.*
     , max(case b.key when 'Name' then b.value end) Name
     , max(case b.key when 'DOB' then b.value end) DOB
  from TableA a
  left join TableB b
    on a.id = b.table_a_id
  group by a.id
      , a.title
      , a.date
      , a.etc

Приведенный выше запрос будет работать, если у вас есть только один из каждого атрибута для данной записи в Таблице A, в противном случае он даст вам наибольшее значение. Если вам нужно несколько значений, вы можете сгенерировать последовательность для каждого атрибута, как показано в подпункте с именем B ниже:

select a.ID
     , b.Seq
     , a.Title
     , a.Date
     , a.Etc
     , max(case b.key when 'Name' then b.value end) Name
     , max(case b.key when 'DOB' then b.value end) DOB
  from TableA a 
  left join (select @Seq:=case
                       when @aid=b.Table_A_ID and @key=b.key
                       then @Seq + 1
                       else 1
                     end Seq
                   , @aid:=b.Table_A_ID Table_A_ID
                   , @key:=b.key `Key`
                   , b.value
                from tableB b
               order by table_a_id, b.key) b
     on a.id = b.table_a_id
  group by a.id, a.title, a.date, a.etc, b.Seq;

Это отличается от ответа @ GMB тем, что он будет возвращать каждый атрибут только один раз с пустыми значениями в строках, где для каждого атрибута меньше значений, тогда как решение @ GMB возвращает произведение CROSS всех атрибутов для данной строки.

0 голосов
/ 18 января 2019
Select a.*, 
(select TOP 1  b.DOB from b where b.table_a_id = a.id and b.key = 'dob'), 
(select TOP 1 b.ame from b where b.table_a_id = a.id and b.key = 'name') 
from a

Вы должны использовать суб-выбор для достижения этих результатов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...