【发布时间】:2020-11-20 09:10:59
【问题描述】:
我最近进行了一项测试,以弄清楚如何优化此 SQL 脚本,我从未编写过脚本,并且只创建查询以获取工作中的数据。这是脚本。
表有有效的数据和连接,@GUID 已经声明并且有 NVARCHAR 值。
这是 SQL 脚本
我对此很陌生,我需要优化这个脚本,据我所知,加入查询而不是使用子查询更好。 (如果我错了请纠正我) 根据我从这个脚本的理解,它是从 2 个不同的数据库中询问信息
CUSTOMER_CARDNUMBER 和 PROFILE
我看不到这些 Fake 数据库中的信息,但这不是本次测试的一部分。
在这些数据库中,它要求提供多个信息 GENERATED_CARDNUMBER 和 CUSTOMER_CARDNUMBER 的值 = @GUID(我不完全理解)
如果 REVISION_Status = A,如果 GUID = @GUID 我理解此脚本在两个数据库中寻找的内容,它将开始更新。如果它没有找到它,它将设置一个带有日期的 REVISION_STATUS 如果查询没有找到 GUID = @GUID; (如有错误请指正)
我可以使用帮助来改进这个脚本,如何以及为什么......即使有一些小错误。
谢谢!!
IF EXISTS
(
SELECT *
FROM CUSTOMER_CARDNUMBER
WHERE GENERATED_CARDNUMBER IN
(
SELECT CARDNUMBER
FROM Profile
WHERE Cardnumber IN
(
SELECT GENERATED_CARDNUMBER
FROM CUSTOMER_CARDNUMBER
WHERE CUSTOMER_CARDNUMBER = @GUID
)
)
)
BEGIN
UPDATE GUID_ACTION
SET
REVISION_STATUS = 'A',
REVISION_DATE_CREATED = GETDATE()
WHERE GUID = @GUID;
END;
ELSE
BEGIN
UPDATE GUID_ACTION
SET
REVISION_STATUS = 'F',
REVISION_DATE_CREATED = GETDATE()
WHERE GUID = @GUID;
END;
【问题讨论】:
-
将
IN更改为JOIN可能会提高一些速度,但实际上上面的SQL 非常简单。最后两条语句(UPDATEs)只能通过确保所需的索引位于表GUID_ACTION上来改进。您尝试使用JOIN的目的是什么? -
或者,您也可以在一个
UPDATE中完成所有操作,而无需EXISTS。 -
我的第一个想法是摆脱子查询,并对 2 个表进行联接查询。 SELECT * FROM CUSTOMER_CARDNUMBER.GENERATED_CARDNUMBER, PROFILE.CARDNUMBER INNER JOIN Profile ON CUSTOMER_CARDNUMBER.???; @Larnu
-
是时候停止使用那些旧式连接了;他们在 28 年前被取代! Bad Habits to Kick : Using old-style JOINs
-
有人可以给我看一个上面的例子吗,用更简单更好,也许更现代的方式.. 似乎无法理解,抱歉这个很新。教程显然向我展示了旧方式..
标签: sql sql-server join subquery