Mysql 如何在SQL中合并两个表?

Mysql 如何在SQL中合并两个表?,mysql,sql,Mysql,Sql,我有两张桌子: Table 1 = idhash - username - usermail Table 2 = idhash - views - fistseen - lastseen 现在,我想将这些表合并到一个新表: Table 3 = idhash - username - usermail - firstseen - lastseen *请注意,我想删除“视图”列 我尝试过在谷歌上找到的解决方案,但到目前为止,它们似乎不起作用 并非表2中的所有idhash列在表1中都有相应

我有两张桌子:

Table 1 = idhash - username - usermail
Table 2 = idhash - views    - fistseen - lastseen
现在,我想将这些表合并到一个新表:

Table 3 = idhash - username - usermail - firstseen - lastseen
*请注意,我想删除“视图”列

我尝试过在谷歌上找到的解决方案,但到目前为止,它们似乎不起作用

  • 并非表2中的所有idhash列在表1中都有相应的idhash。仍然使用空用户名和usermail存储那些“不匹配”的行

您可以选择编程语言对其进行强制。只需构建一个新表,查询两个表,以编程方式连接需要连接的行,插入到新表中。

您可以选择编程语言强制执行。只需构建一个新表,查询两个表,以编程方式连接需要连接的行,插入到新表中。

此查询将提供以下结果:

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

此查询将为您提供以下结果:

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

这应该是一个好的开始。在我们提供更具体的信息之前,您需要告诉我们如何处理不匹配的记录

Select 
    table1.idhash
    ,username
    ,usermail
    ,firstseen
    ,lastseen
From table1
    left join table2
      on table1.idhash = table2.idhash

这应该是一个好的开始。在我们提供更具体的信息之前,您需要告诉我们如何处理不匹配的记录

Select 
    table1.idhash
    ,username
    ,usermail
    ,firstseen
    ,lastseen
From table1
    left join table2
      on table1.idhash = table2.idhash

使用Create语句中的字段类型创建新表


然后在表3中插入一个
,在a.id=b.id上从表1 a、表2 b中选择a.f1、b.f2、c.f3,用Create语句中的字段类型创建新表


然后在表3中插入一个
,在a.id=b.id上从表1a、表2b中选择a.f1、b.f2、c.f3,这非常接近暴力

select coalesce(t1.idhash, t2.idhash) as idhash
, username
, usermail
, firstseen
, lastseen
into table3
from table1 t1
cross join table2 t2

这是非常接近暴力的

select coalesce(t1.idhash, t2.idhash) as idhash
, username
, usermail
, firstseen
, lastseen
into table3
from table1 t1
cross join table2 t2
试试这个:

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
试试这个:

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
我会这样做:

           CREATE TABLE table3
                     AS
                 SELECT idhash, username, usermail, firstseen, lastseen
                   FROM Table1
NATURAL FULL OUTER JOIN Table2
我会这样做:

           CREATE TABLE table3
                     AS
                 SELECT idhash, username, usermail, firstseen, lastseen
                   FROM Table1
NATURAL FULL OUTER JOIN Table2

以下是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
子句中的第二个查询。

以下是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
子句中的第二个查询。

您使用的是什么数据库服务器?为了澄清,您是说表2中的行在表1中没有对应的行?我这样问是因为很多答案都假设相反。您使用的是什么数据库服务器?为了澄清,您是说表2中有一些行在表1中没有对应的行?我这样问是因为很多答案都是相反的,只是在前面加上“INSERT-INTO[table 3]”,然后在前面加上“INSERT-INTO[table 3]”