如果新行没有在

时间:2016-04-13 18:45:49

标签: sql sql-server tsql

我有一个包含以下列的表(tblEntities): ID(标识) 意义(VARCHAR) START_DATE(日期时间) STOP_DATE(DateTime,允许空值)

我想要添加到此表中的一长串值。该列表是通过查询另一个表(tblOther)获得的:

SELECT ITEMNAME
FROM tblOther
GROUP BY ITEMNAME

因此,对于上述查询生成的每个项目,我想:

  • 使用上面的查询中的ITEMNAME插入一个新行作为tblEntities表中的MEANING,如果表中尚不存在
  • 将START_DATE设置为' 1/1/1900'
  • 将STOP_DATE设为当前日期

我怎样才能做到这一点?是从列表中使用WHERE IN还是我需要创建一些函数来循环。

感谢您的帮助,

1 个答案:

答案 0 :(得分:4)

你可以使用这个查询,

INSERT INTO tblEntities (Meaning, Start_Date, Stop_Date)
SELECT DISTINCT(ItemName), '1900-01-01', getdate()
FROM tblOther
WHERE tblOther NOT IN (SELECT DISTINCT(Meaning) FROM tblEntities)

或者对于更优化的查询,您可以使用LEFT JOIN

INSERT INTO tblEntities (Meaning, Start_Date, Stop_Date)
SELECT DISTINCT(ItemName), '1900-01-01', getdate()
FROM tblOther O
LEFT JOIN tblEntities E ON E.Meaning = O.ItemName
WHERE O.ItemName  IS NULL