SQL语法 - LEFT JOIN

时间:2013-09-10 00:33:16

标签: mysql sql variables left-join

我是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,它有多个字段,但只有一个我需要从中获取信息。我的计划是将INSERT启动到destinationTB。由于第一个值不在那里,它应该报告为NULL。第一次插入完成后,字符串仍然以现在存在的相同值运行,它将不再报告NULL并继续前进,直到找到另一个不在destinationTB中的值。

举个例子,我们带电视吧。有多个不同的电视制造商。在这个例子中,我们会说我们有一个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;

3 个答案:

答案 0 :(得分: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 ;
完成查询后,

临时表会消失。

答案 1 :(得分:0)

我将对这个问题进行一些全面的概括。我假设field1是sourceTB和destinationTB上的PK并且是唯一的字段。如果最终目标只是合并两个表,那么这应该只有零影响,因为如果destinationTB.field1 IS NULL那么destinationTB.field1 NEVER 将等于任何东西,包括另一个NULL。你正在寻找一个外部联盟。

INSERT INTO destinationTB
  SELECT sourceTB.id 
  FROM sourceTB 
    LEFT OUTER JOIN destinationTB 
      ON sourceTB.id = destinationTB.id
  WHERE destinationTB.id IS NULL

答案 2 :(得分: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