Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 两个表之间的连接,业务逻辑在十亿行上_Sql_Sql Server_Sql Server 2008_Join_Sql Update - Fatal编程技术网

Sql 两个表之间的连接,业务逻辑在十亿行上

Sql 两个表之间的连接,业务逻辑在十亿行上,sql,sql-server,sql-server-2008,join,sql-update,Sql,Sql Server,Sql Server 2008,Join,Sql Update,我有这样的源表和表目标表 Source: Column1 Column2 Column3 Column4 Destination: Column1 Column2 Column5 Column6 如何在SQL SERVER中实现此逻辑 IF SOURCE.Column1 = DESTINATION.Column1 AND SOURCE.Column2 = DESTINATION.Column2 UPDATE DESTINATION Column5 = SOURCE.Col

我有这样的源表和表目标表

Source:

    Column1 Column2 Column3 Column4

Destination:

    Column1 Column2 Column5 Column6
如何在SQL SERVER中实现此逻辑

IF SOURCE.Column1 = DESTINATION.Column1 AND SOURCE.Column2 = DESTINATION.Column2
UPDATE DESTINATION Column5 = SOURCE.Column1 + 12 (some other logic)
ELSE
Do something else
问题是,我必须处理十亿行,那么实现上述逻辑的最佳方法是什么

EDIT1

IF SOURCE.Column1 = DESTINATION.Column1 AND SOURCE.Column2 = DESTINATION.Column2
UPDATE DESTINATION Column5 = SOURCE.Column1 + 12 (some other logic)
ELSE
**INSERT SOURCE table row to the destination**

我如何实现合并语句,因为我必须只考虑两个列

您可以使用
JOIN
UPDATE
,这对您的性能更为明智。像这样:

UPDATE d
SET d.Column5 = CASE WHEN some logic THEN s.Column1 + 12 (some other logic)
                     ELSE Something else
                ELSE
FROM DESTINATION d
LEFT JOIN SOURCE s ON s.Column2 = d.Colcumn2;


您可以这样使用语句:

MERGE INTO SOURCE AS TGT
USING DESTINATION AS SRC
  ON TGT.Column1 = SRC.Column1 
WHEN MATCHED THEN
  UPDATE SET
    TGT.Column5 = SRC.Column1 + 12 (some other logic)
WHEN NOT MATCHED THEN
  INSERT (Source columns list)
  VALUES (...);
注意:

  • INSERT
    语句中,TableName中没有
    ,因为目标表的名称已在
    MERGE
    子句中定义,即
    SOURCE
    。这就是为什么我将
    源定义为TGT
    ,将
    目标定义为SRC

  • 必须以分号结束
    MERGE
    语句。最好的做法是使用al sql语句

您可以使用
JOIN
UPDATE
,这对您的性能更为明智。像这样:

UPDATE d
SET d.Column5 = CASE WHEN some logic THEN s.Column1 + 12 (some other logic)
                     ELSE Something else
                ELSE
FROM DESTINATION d
LEFT JOIN SOURCE s ON s.Column2 = d.Colcumn2;


您可以这样使用语句:

MERGE INTO SOURCE AS TGT
USING DESTINATION AS SRC
  ON TGT.Column1 = SRC.Column1 
WHEN MATCHED THEN
  UPDATE SET
    TGT.Column5 = SRC.Column1 + 12 (some other logic)
WHEN NOT MATCHED THEN
  INSERT (Source columns list)
  VALUES (...);
注意:

  • INSERT
    语句中,TableName
    中没有
    ,因为目标表的名称已在
    MERGE
    子句中定义,即
    SOURCE
    。这就是为什么我将
    源定义为TGT
    ,将
    目标定义为SRC

  • 必须以分号结束
    MERGE
    语句。最好的做法是使用al sql语句


您可以使用
CASE
表达式包含
ELSE
部分。请看我的编辑。谢谢你的回答,我正在研究这个问题,但是我有一个问题,我现在在问题的编辑部分提到了。我已经写了这个问题,但是我在DST.Column1=SRC.Column1和DST.Column2=SRC.Column2上使用SourceTable AS SRC将DESTINATIONTable作为DST时出错。匹配时选择1,不匹配时选择1,然后选择2@Zerotoinfinite那里在我发布的查询中没有
SELECT
子句。请告诉我您使用的确切查询。让我们使用
CASE
表达式包含
ELSE
部分。请看我的编辑。谢谢你的回答,我正在研究这个问题,但是我有一个问题,我现在在问题的编辑部分提到了。我已经写了这个问题,但是我在DST.Column1=SRC.Column1和DST.Column2=SRC.Column2上使用SourceTable AS SRC将DESTINATIONTable作为DST时出错。匹配时选择1,不匹配时选择1,然后选择2@Zerotoinfinite那里在我发布的查询中没有
SELECT
子句。请你告诉我你使用的确切的查询。让我们只是为了增加你的头痛,如果你正在更新数十亿行,你需要考虑的另一个问题是可用性。您是否有能力关闭数据库(单个用户)以执行更改?请注意,当您运行这样的大规模更新时,对应用程序响应时间的影响将非常显著,可能需要数小时。如果你能让数据库离线,那就太好了;如果没有,那么你需要找出某种“批处理”。@JosephLess谢谢你的建议,这是值得考虑的。但是,由于所有OLAP多维数据集和报表都链接到数据库,我无法关闭数据库。@Zerotoinfinite如果有10亿行或无法停机,请查看少量更新(这是一个示例)。使用十亿行单更新,事务日志将变得疯狂,锁定也会伤害所有其他用户。为了增加您的头痛,如果您正在更新数十亿行,则需要考虑的另一个问题是可用性。您是否有能力关闭数据库(单个用户)以执行更改?请注意,当您运行这样的大规模更新时,对应用程序响应时间的影响将非常显著,可能需要数小时。如果你能让数据库离线,那就太好了;如果没有,那么你需要找出某种“批处理”。@JosephLess谢谢你的建议,这是值得考虑的。但是,由于所有OLAP多维数据集和报表都链接到数据库,我无法关闭数据库。@Zerotoinfinite如果有10亿行或无法停机,请查看少量更新(这是一个示例)。随着10亿行的单次更新,您的事务日志将变得疯狂,并且锁定将伤害所有其他用户。