Как присоединиться к нескольким объединениям, но вернуть разные значения - PullRequest
0 голосов
/ 24 июня 2009

Я пытаюсь объединить несколько столов. Таблица 1 имеет разные идентификаторы Таблица 2 имеет несколько имен для каждого идентификатора. СКАЖИТЕ 3 ИМЕНА Таблица 3 имеет 2 даты для каждого ID

когда я присоединяюсь к трем таблицам, я получаю 6 строк данных для каждого идентификатора, причем каждое из имен появляется дважды, а каждая из дат появляется трижды.

Я хочу, чтобы было записано только 3 строки, возвращающие 3 разных имени и 2 разных даты для каждого идентификатора. Есть ли способ сделать это при использовании соединений в SQL?

Ответы [ 8 ]

2 голосов
/ 24 июня 2009

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

select t1.id,
       max(t2.name),
       max(t3.datefield)
  from table1 t1
  join table2 t2 on t2.id = t1.id
  join table3 t3 on t3.id = t1.id
 group by t1.id
;
1 голос
/ 24 июня 2009

Как насчет чего-то подобного, в котором не используются явные JOIN s:

SELECT T1.ID
  FROM Table1 AS T1
 WHERE EXISTS (
               SELECT * 
                 FROM Table2 AS T2
                WHERE T2.ID = T1.ID
              )
       AND EXISTS (
                   SELECT * 
                     FROM Table3 AS T3
                    WHERE T3.ID = T1.ID
                  );
0 голосов
/ 24 июня 2009

Вы должны решить, какую запись вы хотите получить из каждой таблицы, и присоединиться к ней, чтобы к ней присоединилась только эта запись. То, как вы отображаете данные, вы не можете делать все в одной строке, потому что информация в разных таблицах не совпадает, поэтому вы должны определить, какое бизнес-правило используется для выбора какой из нескольких записей вы хотите.

Теперь, если вы хотите указать основное имя, а также DOb и DOD, я бы сделал следующее: Выберите a.ID, b.NameType, b.Name, c.date как DOB, d.date как DOD ИЗ таблицы 1 LEFT JOIN Table2 b ON a.ID = b.ID и b.name_type = 'Основной' LEFT JOIN Table3 c ON a.ID = c.ID и c.datetype = 'DOB' LEFT JOIN Table3 d ON a.ID = d.ID и d.datetype = 'DOD'

Теперь вы можете сделать то же самое с несколькими объединениями для других имен, но вы, вероятно, не знаете, сколько объединений вы хотели бы заранее. Для этого тоже есть решение, но оно более сложное, и у меня нет времени, чтобы получить его для вас, но в основном вам нужно создать процесс для объединения всех имен вместе во временную таблицу некоторого вида (которая также имеет id) и затем присоединитесь к этой временной таблице.

0 голосов
/ 24 июня 2009

Вот что я пытаюсь сделать

Table1 Я БЫ 401

Таблица 2 ID NameType Name 401 Первичный Anu1 401 АКА Ану2 401 Maiden Anu3

Таблица 3 ID DateType Date 401 ДОБ 1983-09-25 401 DOD 2008-05-07

Я пишу свое присоединение как Выберите a.ID, b.NameType, b.Name, c.datetype, c.date ИЗ таблицы 1 LEFT JOIN Таблица 2 b ON a.ID = b.ID LEFT JOIN Table3 c ON a.ID = c.ID

Это возвращает меня ID NameType Имя Дата Тип Дата 401 Первичный Anu1 DOB 1983-09-25 401 Primary Anu1 DOD 2008-05-07 401 AKA Anu2 DOB 1983-09-25 401 AKA Anu2 DOD 2008-05-07 401 Maiden Anu3 DOB 1983-09-25 401 Maiden Anu3 DOD 2008-05-07

Можно ли получить такие результаты:

ID NameType Имя Datetype Дата 401 Первичный Anu1 DOB 1983-09-25 401 AKA Anu2 DOD 2008-05-07 401 Maiden Anu3

Или любым другим способом, чтобы одни и те же Имена или Даты не повторялись многократно.

0 голосов
/ 24 июня 2009

Я думаю, вам нужно сделать два запроса.

SELECT id, name FROM names WHERE id = 1
SELECT id, date FROM dates WHERE id = 1

Тип операции, которую вы, похоже, пытаетесь выполнить, на самом деле недопустим, поскольку результаты на самом деле не будут отношением. (у вас будет один столбец с 3 строками и один столбец с 2 строками)

0 голосов
/ 24 июня 2009

Вам действительно нужно понять, что именно вы пытаетесь вернуть и почему.

Пожалуйста, опубликуйте исходные строки вашего примера и результаты, которых вы хотите достичь (и почему).

Причина, по которой вы получаете 6 строк, состоит в том, что есть 6 возможностей, которые соответствуют вашей модели, как вы ее указали.

Если это «слишком много», вам нужно добавить дополнительный критерий, который еще не установлен, который определяет , какую дату следует отображать с каждым именем.

0 голосов
/ 24 июня 2009

Если я правильно понял вопрос, вы захотите использовать предложение GROUP BY

http://www.w3schools.com/sql/sql_groupby.asp

0 голосов
/ 24 июня 2009

Если вы предваряете запрос с помощью SELECT DISTINCT, вы должны возвращать только отдельные строки.

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