Как объединить две таблицы в SQL? - PullRequest
1 голос
/ 16 февраля 2012

У меня есть две таблицы:

Table 1 = idhash - username - usermail
Table 2 = idhash - views    - fistseen - lastseen

Теперь я хочу объединить эти таблицы в новую таблицу:

Table 3 = idhash - username - usermail - firstseen - lastseen

* обратите внимание, что я хочу удалить столбец представлений.

Я пробовал с решениями, которые я нашел в Google, но пока они, похоже, не работают.

  • Не все столбцы idhash из таблицы 2 имеют соответствующий idhash в таблице 1. Все эти «несовпадающие» строки хранятся с пустым именем пользователя и usermail

Ответы [ 9 ]

3 голосов
/ 16 февраля 2012

Этот запрос даст вам результаты:

SELECT A.*, B.firstseen, B.lastseen
FROM [Table 1] A
LEFT JOIN [Table 2] B
ON A.idhash = B.idhash

А для вставки и обновления результатов на вашем [Таблица 3]:

INSERT INTO [Table 3](idhash, username, usermail, firstseen, lastseen)
SELECT A.*, B.firstseen, B.lastseen
FROM [Table 1] A
LEFT JOIN [Table 2] B
ON A.idhash = B.idhash
LEFT JOIN [Table 3] C
ON A.idhash = C.idhash
WHERE C.idhash IS NULL

-- For SQL Server
UPDATE T3
SET firstseen = T1.firstseen,
    lastseen = T1.lastseen
FROM [Table 3] T3
INNER JOIN (SELECT A.*, B.firstseen, B.lastseen
            FROM [Table 1] A
            LEFT JOIN [Table 2] B
            ON A.idhash = B.idhash) T1
WHERE T3.firstseen != T1.firstseen OR T3.lastseen != T1.lastseen
1 голос
/ 16 февраля 2012

Вот решение для MySQL:

CREATE TABLE table3
// First get all the rows from table2, paired with matching rows from table1
(SELECT a.idhash, b.username, b.usermail, a.firstseen, a.lastseen
FROM table2 a
LEFT JOIN table1 b
  ON b.idhash = a.idhash)
// Now get the remaining rows from table1 that don't have matches
UNION ALL
(SELECT null, a.username, a.usermail, null, null
FROM table1 a
LEFT JOIN table2 b
  ON b.idhash = a.idhash
WHERE b.idhash IS NULL)

Если вы не хотите, чтобы строки из таблицы1 не имели соответствующих строк в таблице2, удалите второй запрос в предложении UNION.

0 голосов
/ 16 февраля 2012

Я бы сделал это:

           CREATE TABLE table3
                     AS
                 SELECT idhash, username, usermail, firstseen, lastseen
                   FROM Table1
NATURAL FULL OUTER JOIN Table2
0 голосов
/ 16 февраля 2012

попробуйте это:

INSERT INTO table3 (idhash, username, usermail, firstseen, lastseen)
SELECT  a.idhash, a.username, a.usermail,
        b.firstseen, b.lastseen
FROM    table1 a LEFT JOIN table2 b 
            ON a.idhash = b.idhash
0 голосов
/ 16 февраля 2012

Это довольно близко к грубой силе.

select coalesce(t1.idhash, t2.idhash) as idhash
, username
, usermail
, firstseen
, lastseen
into table3
from table1 t1
cross join table2 t2
0 голосов
/ 16 февраля 2012

Создайте новую таблицу с типами полей в вашем операторе создания

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

Затем сделайте insert Into Table3 <yourtable> select a.f1,b.f2,c.f3 from Table1 a, Table 2 b on a.id = b.id

0 голосов
/ 16 февраля 2012

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

Select 
    table1.idhash
    ,username
    ,usermail
    ,firstseen
    ,lastseen
From table1
    left join table2
      on table1.idhash = table2.idhash
0 голосов
/ 16 февраля 2012
insert into table3
select t1.idhash, t1.username, t1.usermail, t2.firstseen,t2.lastseen
from table1 t1 left join table2 t2 on t1.idhas=t2.idhas
0 голосов
/ 16 февраля 2012

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

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