我是SQL和SQL服务器的新手,对以下问题有任何帮助。
我正在尝试用新价格更新股价表。
该表有三列:共享代码,日期,价格。
股票代码+日期= PK
您可以想象,如果您拥有数千个共享代码和10年的数据,那么该表可能会变得非常大。所以我创建了一个名为共享ID表的单独表,并在第一个表中使用共享ID(我被可靠地告知这将加快查询速度,因为按整数搜索比字符串更快)。
总而言之,我有两个表如下:
Table 1 = Share_code_ID (int), Date, Price
Table 2 = Share_code_ID (int), Share_name (string)
所以,假设我想用今天的ZZZ股票价格来更新表格。我需要:
现在让我们忽略如何为新代码生成Share_code_ID,稍后我会担心。
我正在尝试基于以下结构松散地使用合并查询,但不知道我在做什么:
MERGE INTO [Table 1]
USING (VALUES (1,23-May-2013,1000)) AS SOURCE (Share_code_ID,Date,Price)
{ SEEMS LIKE THERE SHOULD BE AN INNER JOIN HERE OR SOMETHING }
ON Table 2 = 'ZZZ'
WHEN MATCHED THEN UPDATE SET Table 1.Price = 1000
WHEN NOT MATCHED THEN INSERT { TO BOTH TABLES }
任何帮助都将不胜感激。
答案 0 :(得分:0)
http://msdn.microsoft.com/library/bb510625(v=sql.100).aspx
您使用Table1作为target table
,将Table2作为source table
使用
如果在表2中找不到给定ID,则需要执行操作 - 在source table
在您已阅读的文档中,该文档对应于
子句WHEN NOT MATCHED BY SOURCE ... THEN <merge_matched>
,后者对应
<merge_matched>::=
{ UPDATE SET <set_clause> | DELETE }
Ergo,你不能在那里插入源表。 你可以使用触发器自动插入,当你在Table1中插入一些东西,但是无法插入正确的Shared_Name时 - 触发器就是不知道它。
所以我猜你有两种选择。
1)制作T-SQL代码块 - 查找存储过程。我认为还有一个构造在MS SQ中执行匿名代码块,比如Firebird SQL Server中的EXECUTE BLOCK命令,但我不确定。
2)创建可更新的SQL VIEW,连接Table1和Table2以显示最后一个当前日期,这样当您在此视图中插入行时,视图的插入触发器实际上会向两个表插入行。当您更新视图中的数据时,更新后触发器将修改数据。