Подтвердить что ты не робот

MySQL true row merge... не просто объединение

Что такое mysql Мне нужно достичь результата ниже, учитывая эти две таблицы:

table1:

+----+-------+
| id | name  |
+----+-------+
|  1 | alan  |
|  2 | bob   |
|  3 | dave  |
+----+-------+

table2:

+----+---------+
| id | state   |
+----+---------+
|  2 | MI      |
|  3 | WV      |
|  4 | FL      |
+----+---------+

Я хочу создать временное представление, похожее на это

желаемый результат:

+----+---------+---------+
| id | name    | state   |
+----+---------+---------+
|  1 | alan    |         |
|  2 | bob     | MI      |
|  3 | dave    | WV      |
|  4 |         | FL      |
+----+---------+---------+

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

create view table3 as
(select id,name,"" as state from table1)
union
(select id,"" as name,state from table2)

Результат таблицы3:

+----+---------+---------+
| id | name    | state   |
+----+---------+---------+
|  1 | alan    |         |
|  2 | bob     |         |
|  3 | dave    |         |
|  2 |         | MI      |
|  3 |         | WV      |
|  4 |         | FL      |
+----+---------+---------+
4b9b3361

Ответ 1

Вам нужно использовать оператор SQL под названием JOIN, чтобы получить то, что вы хотите.

JOIN является фундаментальной частью языка SQL, так как цикл while используется для других языков программирования.

Начните здесь: Визуальное объяснение соединений SQL

Другой способ мышления JOIN vs. UNION:

  • UNION добавляет строки вместе.
  • JOIN объединяет столбцы.

Например:

SELECT * 
FROM table1
JOIN table2 USING (id);

Это стиль объединения, который возвращает только строки, для которых в обеих таблицах существует соответствующий идентификатор. Но вы хотите, чтобы все те id, для которых существует строка, по крайней мере в одной таблице или другой.

SELECT * 
FROM table1
LEFT OUTER JOIN table2 USING (id);

Это получает все строки из таблицы1 с соответствующими строками в таблице2. Но чтобы получить обратное, нам понадобится:

SELECT * 
FROM table1
RIGHT OUTER JOIN table2 USING (id);

SQL также определяет FULL OUTER JOIN, который будет работать одновременно, но, к сожалению, MySQL не реализовал эту часть стандарта SQL. Но мы можем использовать UNION для объединения двух типов объединений. Союз по умолчанию удаляет повторяющиеся строки.

update: Я беспокоился об этом и заставил его работать. Оказывается, вы должны явно указывать столбцы, чтобы убедиться, что они находятся в одинаковых столбцах в обоих объединенных запросах. Здесь запрос, который работает, скопирован из моего окна терминала:

SELECT id, name, state
FROM table1
LEFT OUTER JOIN table2 USING (id)
UNION
SELECT id, name, state
FROM table1
RIGHT OUTER JOIN table2 USING (id);

Это хорошая привычка вообще избегать использования SELECT *, и это всего лишь еще один случай, когда это хорошая идея.

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

Этот запрос производит следующий вывод, скопированный из моего окна терминала:

+----+------+-------+
| id | name | state |
+----+------+-------+
|  1 | alan | NULL  |
|  2 | bob  | MI    |
|  3 | dave | WV    |
|  4 | NULL | FL    |
+----+------+-------+

PS: Спасибо, что задали вопрос так ясно!

Ответ 2

Вам нужно FULL OUTER JOIN:

SELECT coalesce(a.id, b.id), a.name, b.state
FROM table1 a
FULL OUTER JOIN table2 b ON (a.id = b.id)