Как объединить эти две таблицы MySQL? - PullRequest
2 голосов
/ 23 июля 2011

tableone

a  |b| c
--------
a1 | |c1
a2 | |c2
a3 | |c3

tabletwo

a | b
-----
a1|b1
a2|b2
a3|b3
a4|b4
a5|b5

1007 * слиты *

a | b | c
a1| b1|c1
a2| b2|c2
a3| b3|c3
a4| b4|
a5| b5|

Итак, у меня есть две таблицы, и я хочу объединить их. Я попробовал в phpmyadmin эти два варианта:

INSERT IGNORE INTO tableone SELECT * FROM tabletwo;
REPLACE INTO tableone SELECT * FROM tabletwo;

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

Ответы [ 2 ]

3 голосов
/ 23 июля 2011

Попробуйте эти запросы вплотную:

INSERT IGNORE INTO tableone (a) SELECT a FROM tabletwo;

UPDATE tableone, tabletwo
SET tableone.b = tabletwo.b
WHERE tableone.a = tabletwo.a;

Чтобы ответить на pst, что-то вроде этого, предполагая, что tableone не имеет столбец b:

INSERT INTO tablethree (a, b, c)

SELECT * FROM ((
    SELECT
        tableone.a AS a,
        tabletwo.b AS b,
        tableone.c AS c

    FROM tableone

    LEFT OUTER JOIN tabletwo
    ON tableone.a = tabletwo.a
) UNION (
    SELECT
        tabletwo.a AS a,
        tabletwo.b AS b,
        tableone.c AS c

    FROM tableone

    RIGHT OUTER JOIN tabletwo
    ON tableone.a = tabletwo.a
)) AS x

Это не проверено, но должно работать. («Должен» ...) UNION - это обходной путь отсутствия MySQL в FULL OUTER JOIN.

1 голос
/ 23 июля 2011
CREATE TABLE merged AS
SELECT A.a,A.b,B,B.c FROM
tabletwo A LEFT JOIN tableone USING (a);

Сначала я выбрал tabletwo, потому что он имеет все необходимые ключи

Конечно, поскольку у tabletwo есть все клавиши, это идеальный случай.

Используя теорию множеств, что если вы делаете, если пересечение клавиш Tableone и ключей Tabletwo не совпадает со всеми ключами Tableone или всех ключей TabletW? Сделайте это:

CREATE TABLE merged AS
SELECT
    A.a,B.b,C.c
FROM
(
    SELECT a FROM tableone
    UNION
    SELECT a FROM tabletwo
) A
LEFT JOIN tableone B USING (a)
LEFT JOIN tabletwo C USING (a);

Встроенный SELECT A имеет все объединенные ключи как набор UNION.

Любая строка из B, пропускающая что-то из C, получает пустой столбец для этой пропущенной записи из C.

Любая строка из C, в которой что-то отсутствует, B получает столбец NULL для этой отсутствующей записи из B.

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