MySQL Union для двух таблиц, а затем объединить в третьей таблице, где совпадают? - PullRequest
0 голосов
/ 04 февраля 2011

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

В основном у меня есть две таблицы (table_one и table_two), которые я пытаюсьUNION DISTINCT, который отлично работает.Это когда я пытаюсь принести третий стол, что все взрывается и решает ничего не возвращать.Я уверен, что это ошибка пользователя:)

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

SELECT
    part_code,
    name
FROM
    table_three

WHERE
    table_three.part_code = (

    SELECT
        part_code
    FROM
        table_one

    UNION DISTINCT
    SELECT
        part_code
    FROM
        table_two
)

ORDER BY
    name ASC

Я ценю любое направление, которое кто-то может предложить.

Ответы [ 2 ]

6 голосов
/ 04 февраля 2011
WHERE
    table_three.part_code IN(
                          ^^

Редактировать
Вот несколько альтернатив, которые удовлетворяют: Поместите все строки в таблице 3 так, чтобы код детали существовал либо в таблице 1, либо в таблице 2 .

select t3.part_code
      ,t3.name
  from table_three t3
 where part_code in(select t1.part_code from table_one t1)
    or part_code in(select t2.part_code from table_two t2);

Производный стол с объединением

select t3.part_code
      ,t3.name
  from table_three t3
  join (select part_code from table_one 
         union
        select part_code from table_two
       ) t12
     on(t3.part_code = t12.part_code);

Внутреннее соединение с союзом

select t3.part_code
      ,t3.name
  from table_three t3
  join table_one   t1 on(t3.part_code = t1.part_code)
union   
select t3.part_code
      ,t3.name
  from table_three t3
  join table_two   t2 on(t3.part_code = t2.part_code);  

Бонус. Понятия не имею, почему я это сделал.

select t3.part_code
      ,t3.name
  from table_three t3
  left join (select distinct part_code 
                      from table_one) t1 on(t3.part_code = t1.part_code)
  left join (select distinct part_code 
                      from table_two) t2 on(t3.part_code = t2.part_code)
 where t3.part_code = t1.part_code
    or t3.part_code = t2.part_code;

Дайте мне знать, как они работают.

Редактировать 2.
Хорошо, попробуйте следующее. Он должен произвести объединение таблиц T1 и T2. Затем для каждой строки будет выбрано имя из T3, если такой код детали будет найден.

Если part_code является ключом во всех таблицах, вы можете вместо этого сделать UNION ALL.

select T12.part_code
      ,coalesce(T3.name, T12.name) as name
  from (select part_code, name from table_one T1 union   
        select part_code, name from table_two T2
       ) T12
  left join table_three T3 on(T1.part_code = T3.part_code);
0 голосов
/ 04 февраля 2011

попробуйте что-то вроде этого :) </p> <pre><code>SELECT part_code, name FROM table_three WHERE table_three.part_code = ( SELECT part_code FROM table_one UNION DISTINCT ( SELECT part_code FROM table_two )) ORDER BY name ASC;

...