【问题标题】:Insert a new line based on the existing table data (SQL Server 2008 R2)根据现有表数据插入新行 (SQL Server 2008 R2)
【发布时间】:2015-02-06 22:19:55
【问题描述】:

现在我有两张桌子,

Table A:

  number  date       name
  -------------------------
  a1101   20141209   jim
  a1101   20141210   jim
  a1101   20141211   jim
  a1102   20141209   andy

Table B:

  number  date       
  -------------------
  a1101   20141209   
  a1101   20141210   
  a1101   20141211 
  a1101   20141212

如你所见,当number = a1101,日期"20141212"table A中不存在,当满足这个条件时,我需要向table A插入数据:

 number  date       name
 a1101   20141212   jim

我不知道这个sql怎么写,期待你的帮助。

添加:

当我表演时:MERGE tableA As Target USING (Select b.number, b.date, a.name From tableB b Left Join tableA a ON a.number = b.number )AS Source ON Source.number = Target.number AND
Source.date = Target.date WHEN NOT MATCHED THEN INSERT (number, date, name) VALUES (source.number, source.date, source.name);
插入三个相同的数据:

a1101   20141212  jim
a1101   20141212  jim
a1101   20141212  jim

【问题讨论】:

  • 如果tableA中不存在数据,我如何获取特定数字的名称

标签: sql-server select join insert left-join


【解决方案1】:

您可以使用 INSERT...SELECT 语句。

试试这个:

INSERT INTO tableA (number, date, name)
SELECT b.number, b.date, c.name
FROM tableB AS b 
INNER JOIN (SELECT a.number, MAX(a.name) AS name FROM tableA a GROUP BY a.number) AS c ON a.number = c.number 
LEFT OUTER JOIN tableA AS a ON b.number = a.number AND b.date = a.date 
WHERE a.number IS NULL;

【讨论】:

  • 谢谢!但是“(SELECT a.number, a.name FROM tableA a GROUP BY a.number)”是错误的:a.name 不是聚合函数!
  • 感谢您的帮助!但是名字是varchar类型,可以用max函数吗?而这个语句的性能怎么样,因为千万表A的行数
【解决方案2】:

你可以像这样使用SQLMerge进行条件插入,

MERGE TableA As Target
USING (Select b.number, b.date, a.name From TableB b Left Join TableA a ON a.number = b.number  )AS Source
ON Source.number  = Target.number  AND       
 Source.date = Target.date
WHEN NOT MATCHED THEN
 INSERT (number, date, name)
    VALUES (source.number, source.date, source.name)

【讨论】:

  • 谢谢,但是“ON Source.number = Target.number AND ON Source.date = Target.date”是错误的!不能有两个“on”吗?
  • 我需要插入 Target.name!当我执行:“... INSERT (number , date,name ) VALUES (source.number, source.date,Target.name)” 是错误的:
  • 感谢您的耐心解答!但是Tableb本栏目没有名字
  • 我发现插入新记录的时候,数据不是来自Target表,不是吗?在线等待您的回复
  • 对不起,我没有找到这个:(Select b.number, b.date, a.name From TableB b Left Join TableA a ON a.number = b.number )AS Source。
【解决方案3】:
INSERT INTO #TableA
SELECT DISTINCT a.Number,
       a.[date],
       b.name
FROM   #TableB A
INNER JOIN   #TableA B ON A.NUMBER = B.NUMBER              
WHERE  A.DATE NOT IN (SELECT [date]
                      FROM   #TableA) 

【讨论】:

  • 请添加一些解释。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-17
  • 2013-02-01
  • 2012-02-18
相关资源
最近更新 更多