gpt4 book ai didi

mysql - 从 SQL Server 转换为 MySQL - MERGE

转载 作者:行者123 更新时间:2023-11-28 23:36:16 26 4
gpt4 key购买 nike

我正在将存储过程从 SQL Server 转换到 MySQL,我发现了一个让我难过的查询:

IF EXISTS (SELECT * FROM dbo.T_ExampleTable WHERE Col1 = @Col1 AND Col2 = @Col2 AND Col3 = @Col3)
SET @return_value = -10
ELSE IF EXISTS (SELECT * FROM dbo.T_ExampleTable WHERE Col1 = @Col1 OR Col2 = @Col2 OR Col3 = @Col3)
SET @return_value = -20;

IF @return_value = 0
BEGIN
MERGE ExampleDB.dbo.T_ExampleTable AS T
USING (VALUES (@Col1, @Col2, @Col3)) AS S (Col1, Col2, Col3)
ON T.Col1 = S.Col1
WHEN NOT MATCHED THEN
INSERT VALUES (S.Col1, S.Col2, S.Col3);
END

为了安全起见,我更改了变量的名称,但语法是一样的。

我想我已经掌握了这里的 MERGE 发生了什么(但如果我错了请纠正我)。我假设我们正在获取 3 个变量(@Col1@Col2@Col3)并将它们放入结果集中叫“S”。然后,我们检查 T_ExampleTable 中的每一行是否有匹配的 Col1 值。最后,我们说如果它在任何行中都不匹配,INSERT 这些值。

现在,我不太熟悉 MERGE 语法,所以我可能不支持上述假设。然而,假设我是正确的,这与执行 SELECT FROM T_ExampleTable WHERE Col1 = @Col1,然后检查 @@ROWCOUNT(或 FOUND_ROWS() 在 MySQL 中),如果它不等于 0,则执行 INSERT?

此外,我对MERGE上面的逻辑更加困惑。如果我对 MERGE 工作原理的理解是正确的(同样,它可能不正确),那么整个语句就毫无意义。因为基本上,如果 @Col1 存在于 T_ExampleTable 中,那么 @return_value 将等于 -10 或 -20。因此,它不能等于 0,我们不会点击 MERGE。如果 @Col1 不存在于 T_ExampleTable 中,则 @return_value 将等于 0,但 MERGE 不是不会返回任何结果集,因为 T.Col1 = S.Col1 永远不会为真。

这就是为什么我相信我一定是误解了 MERGE 的工作原理。要么,要么我正在移植的 SQL Server 代码编写得不好(我猜这也是可能的)。

所以最终,我要在这里寻找两个答案。一个有助于阐明 MERGE 语句的逻辑是什么,以及我对上述代码的理解是否正确,另一个显示了将其转换为 MySQL 的可能解决方案。

谢谢!

最佳答案

出于实际目的,我认为这等同于此(在两个数据库中):

INSERT INTO T(Col1, Col2, Col3)
SELECT col1, col2, col3
FROM (SELECT @Col1 as col1, @Col2 as col2, @Col3 as col3) s
WHERE NOT EXISTS (SELECT 1
FROM ExampleDB.dbo.T_ExampleTable t
WHERE t.col1 = s.col1
);

可能存在一些不完全相同的边缘情况——例如,在对存储过程的并发调用方面,或者当 col1NULL 时。但是无论如何,您在两个数据库之间的锁定方面已经存在差异。

(而且,虽然您没有问,但我希望 Postgres 成为从 SQL Server 切换到的更自然的数据库,因为 Postgres 和 SQL Server 在功能上有更大的重叠。)

关于mysql - 从 SQL Server 转换为 MySQL - MERGE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35671963/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com