0

我是stackoverflow的新手,所以请温柔。我的 SQL 语法有严重问题。底线是我想从一个表复制到另一个没有重复。我打算比较两个字段,并且仅当destinationTB 中的field1 为NULL 时才插入。

请知道我是 SQL 语句的新手,所以任何扩展知识都会有所帮助......例如我可以使用变量。我从 stackoverflow 研究中得到了最初的声明,但无法完成。

这是我所拥有的,感谢您的帮助:

 INSERT INTO destinationTB
 SELECT sourceTB.field1, destinationTB.field1
 FROM sourceTB
 LEFT JOIN destinationTB
 ON sourceTB.field1 = destinationTB.field1
 WHERE destinationTB.field1 IS NULL;

----- 修改后的问题 -----

感谢您的小费!我将尝试修改问题(和未来的问题)以使其更易于理解,并对我上一个问题中尴尬的“新手”气味表示歉意。

我正在寻找的最终结果是从一个表复制到另一个表而不重复。我正在使用两张表。第一个是destinationTB,它有四个字段,我只想填充其中一个。第二个表是 sourceTB,它有多个字段,但我只需要从中获取信息。我的计划是开始插入到destinationTB。由于第一个值不在那里,它应该报告为 NULL。在第一次插入完成后,字符串仍在针对现在存在的相同值运行,它将不再报告 NULL 并继续前进,直到找到另一个不在目标 TB 中的值。

例如,让我们以电视为例。有多个不同的电视制造商。在这个例子中,我们会说我们有一个 SHARP-32in、一个 SHARP-45in 和一个 SHARP-60in。我希望destinationTB只有一个SHARP实例(即使sourceTB中有三个。所以,我试图使用该JOIN语句将destinationTB.manufacturer与sourceTB.manufacturer进行比较。当我运行这个查询时,我将在之后粘贴在本段中,它返回所有三个实例,因此我的destinationTB 中最终得到了三个SHARP 值。

这是我根据您的建议尝试的最新方法:

INSERT INTO destnationTB (field1)
SELECT sourceTB.field1
FROM sourceTB
LEFT JOIN destinationTB ON sourceTB.field1 = destinationTB.field1
WHERE destinationTB.field1 IS NULL;
4

3 回答 3

0

好吧,我想出了一个解决我上面修改过的问题的方法。此语句将仅返回在 sourceTB 中多次出现的值的单个实例。

INSERT INTO destinationTB (field1)
SELECT DISTINCT field2 FROM sourceTB
WHERE EXISTS (SELECT field1 FROM destinationTB)

感谢您的帮助,以及在这里写问题时的提示。

这是我的答案参考: http: //dev.mysql.com/doc/refman/5.0/en/exists-and-not-exists-subqueries.html

于 2013-09-11T01:42:08.943 回答
0

我将对这个问题做一些全面的概括。我假设 field1 在 sourceTB 和 destinationTB 上是 PK 并且是唯一的字段。如果最终目标是仅合并两个表,那么这应该具有零影响,因为如果destinationTB.field1 IS NULLthendestinationTB.field1永远不会等于任何东西,包括另一个 NULL。您正在寻找外部连接。

INSERT INTO destinationTB
  SELECT sourceTB.id 
  FROM sourceTB 
    LEFT OUTER JOIN destinationTB 
      ON sourceTB.id = destinationTB.id
  WHERE destinationTB.id IS NULL
于 2013-09-10T05:36:58.567 回答
0

您似乎正在尝试插入两个field1列,而您的目标表只有一个。它应该是:

INSERT into destinationTB 
    SELECT sourceTB.field1 
    FROM sourceTB 
    LEFT JOIN destinationTB ON sourceTB.field1 = destinationTB.field1 
    WHERE destinationTB.field1 IS NULL;

相应地扩展到应该插入的每个字段。如果您的语法变得太复杂,您也可以使用临时表:

    CREATE TEMPORARY TABLE tempTB as 
    SELECT sourceTB.field1 
    FROM sourceTB 
    LEFT JOIN destinationTB ON sourceTB.field1 = destinationTB.field1 
    WHERE destinationTB.field1 IS NULL;

    INSERT into destinationTB 
    SELECT tempTB.field1 
    FROM tempTB ;

完成查询后临时表会消失。

于 2013-09-10T00:42:36.893 回答