【发布时间】:2020-02-17 14:50:42
【问题描述】:
我正在尝试编写一个查询,该查询将为帐户代码的每个段提取描述。表格如下:
我想要做的是让每个 CTRC 部分为匹配示例的 CTACCT 提取 CTDESC:
我的原始数据有超过 400 万行,因此我无法导出到 excel 以进行正常的 Vlookup。我只有一张包含所有这些数据的表,并且无法进行自联接以提取所有行,我一次只能做一个部分。
SELECT TOP 10
RTRIM(a.CTACCT) AS [CTACCT],
RTRIM(a.CTRC01) AS [CTRC01],
NULLIF(CONCAT(RTRIM(a.CTrc01), '-', RTRIM(a.CTrc02)), CONCAT(RTRIM(a.CTrc01), '-')) AS [CTRC02],
NULLIF(CONCAT(RTRIM(a.CTrc01), '-', RTRIM(a.CTrc02), '-', RTRIM(a.CTrc03)), CONCAT(RTRIM(a.CTrc01), '-', RTRIM(a.CTrc02), '-')) AS [CTRC03],
NULLIF(CONCAT(RTRIM(a.CTrc01), '-', RTRIM(a.CTrc02), '-', RTRIM(a.CTrc03), '-', RTRIM(a.CTrc04)), CONCAT(RTRIM(a.CTrc01), '-', RTRIM(a.CTrc02), '-', RTRIM(a.CTrc03), '-')) AS [CTRC04],
NULLIF(CONCAT(RTRIM(a.CTrc01), '-', RTRIM(a.CTrc02), '-', RTRIM(a.CTrc03), '-', RTRIM(a.CTrc04), '-', RTRIM(a.CTrc05)), CONCAT(RTRIM(a.CTrc01), '-', RTRIM(a.CTrc02), '-', RTRIM(a.CTrc03), '-', RTRIM(a.CTrc04), '-')) AS [CTRC05],
NULLIF(CONCAT(RTRIM(a.CTrc01), '-', RTRIM(a.CTrc02), '-', RTRIM(a.CTrc03), '-', RTRIM(a.CTrc04), '-', RTRIM(a.CTrc05), '-', RTRIM(a.CTrc06)), CONCAT(RTRIM(a.CTrc01), '-', RTRIM(a.CTrc02), '-', RTRIM(a.CTrc03), '-', RTRIM(a.CTrc04), '-', RTRIM(a.CTrc05), '-')) AS [CTRC06],
a.CTDESC AS [CTDESC],
a.CTSEGN AS [CTSEGN]
FROM [PSA].[dbo].[SMFD35_GLDBFA_GLPCT] a WITH (NOLOCK);
我正在使用 SQL Server。
【问题讨论】:
-
SQL 中的“
VLookup”称为JOIN。另外,为什么在这里使用NOLOCK?你明白它的用途是什么意思吗? -
您编辑了代码阻止的表格以换取图片。这是一个倒退。
-
数据和结果的图像几乎一文不值。 Why?
-
“我的公司也需要无锁,因为可以有多个人从数据中提取数据” 听起来你的公司需要实际实施一些索引,而不是告诉人们他们应该这样做对错误的结果保持“正常”。
-
呃。我了解很多人。但是 NOLOCK 并不是一个神奇的快速按钮。它会做一些有趣的事情,例如随机返回丢失和/或重复的行,因此您无法重现错误。这里跳出来的另一件事是该表似乎存在一些规范化问题。当你有 CTrc01、CTrc02 之类的东西时,你就有了所谓的重复组。它违反了 1NF。
标签: sql-server join sql-server-2012 vlookup self-join