解密 SQL 查询
Deciphering SQL query
我目前正在查看查询,但无法访问执行查询的数据库。 (这并不理想,但这就是我的任务)。我不是 SQL 专家并试图确定以下代码的作用,因为我无法 运行 查询。它正在读取和写入相同的温度table(复制?)。我不知道'Y'的来源是什么,最终的结果是什么。任何帮助表示赞赏。谢谢。
INSERT INTO #temp1
SELECT X.CURSTATUS ,X.GENDER ,Y.PACKAGE ,X.AGE ,1 AS factor1 ,1 AS factor2;
FROM #temp1 X WITH (NOLOCK) ,
( SELECT 'P1' AS PACKAGE UNION ALL SELECT 'P2' ) Y
WHERE X.PACKAGE = 'P5';
并不是真的写到同一个table。它是 "appending" 行到相同的 table。也就是说,table 中的现有数据不受影响。
它所做的是为所有 "P5" 包的包 "P1" 和 "P2" 添加行。这会将新行添加到 table; "P5" 行保留。
INSERT INTO #temp1
-- 这是数据被插入的地方。顺便说一句,它应该明确定义列,这种格式是 SQL 反模式
SELECT X.CURSTATUS ,X.GENDER ,Y.PACKAGE ,X.AGE ,1 AS factor1 ,1 AS factor2;
FROM #temp1 X WITH (NOLOCK) ,
-- 这是从#temp
中选择当前行
( SELECT 'P1' AS PACKAGE UNION ALL SELECT 'P2' ) Y
--Y 是两条记录 table,其中一列称为 package,因为没有显示特定的连接,它是一个交叉连接 - 又是一个反模式,最好显式使用 Cross加入关键词,一目了然
WHERE X.PACKAGE = 'P5';
-- 这会过滤来自 #temp 的记录,以仅获取记录值为 'P5' 的记录。由于它交叉连接到 Two 记录 table Y,因此它将其他列中的数据用于 P% 记录,并为 P1 和 P2 插入新记录。如果您有 10 个 P5 记录,则此插入将插入 10 个 P1 记录和 10 个 P2 记录。
对于#temp 中 PACKAGE 值为 "P5" 的每一行,查询将分别插入两个 PACKAGE 值为 "P1" 和 "P2" 的新行。
重新格式化查询并将过时的语法替换为现代语法应该更容易理解。
INSERT INTO #temp1 (CURSTATUS, GENDER, PACKAGE, AGE, factor1, factor2)
SELECT
X.CURSTATUS,
X.GENDER,
Y.PACKAGE,
X.AGE,
1 AS factor1,
1 AS factor2
FROM
#temp1 X
CROSS JOIN (
SELECT 'P1' AS PACKAGE
UNION ALL
SELECT 'P2'
) Y
WHERE
X.PACKAGE = 'P5';
我目前正在查看查询,但无法访问执行查询的数据库。 (这并不理想,但这就是我的任务)。我不是 SQL 专家并试图确定以下代码的作用,因为我无法 运行 查询。它正在读取和写入相同的温度table(复制?)。我不知道'Y'的来源是什么,最终的结果是什么。任何帮助表示赞赏。谢谢。
INSERT INTO #temp1
SELECT X.CURSTATUS ,X.GENDER ,Y.PACKAGE ,X.AGE ,1 AS factor1 ,1 AS factor2;
FROM #temp1 X WITH (NOLOCK) ,
( SELECT 'P1' AS PACKAGE UNION ALL SELECT 'P2' ) Y
WHERE X.PACKAGE = 'P5';
并不是真的写到同一个table。它是 "appending" 行到相同的 table。也就是说,table 中的现有数据不受影响。
它所做的是为所有 "P5" 包的包 "P1" 和 "P2" 添加行。这会将新行添加到 table; "P5" 行保留。
INSERT INTO #temp1
-- 这是数据被插入的地方。顺便说一句,它应该明确定义列,这种格式是 SQL 反模式
SELECT X.CURSTATUS ,X.GENDER ,Y.PACKAGE ,X.AGE ,1 AS factor1 ,1 AS factor2;
FROM #temp1 X WITH (NOLOCK) ,
-- 这是从#temp
中选择当前行 ( SELECT 'P1' AS PACKAGE UNION ALL SELECT 'P2' ) Y
--Y 是两条记录 table,其中一列称为 package,因为没有显示特定的连接,它是一个交叉连接 - 又是一个反模式,最好显式使用 Cross加入关键词,一目了然
WHERE X.PACKAGE = 'P5';
-- 这会过滤来自 #temp 的记录,以仅获取记录值为 'P5' 的记录。由于它交叉连接到 Two 记录 table Y,因此它将其他列中的数据用于 P% 记录,并为 P1 和 P2 插入新记录。如果您有 10 个 P5 记录,则此插入将插入 10 个 P1 记录和 10 个 P2 记录。
对于#temp 中 PACKAGE 值为 "P5" 的每一行,查询将分别插入两个 PACKAGE 值为 "P1" 和 "P2" 的新行。
重新格式化查询并将过时的语法替换为现代语法应该更容易理解。
INSERT INTO #temp1 (CURSTATUS, GENDER, PACKAGE, AGE, factor1, factor2)
SELECT
X.CURSTATUS,
X.GENDER,
Y.PACKAGE,
X.AGE,
1 AS factor1,
1 AS factor2
FROM
#temp1 X
CROSS JOIN (
SELECT 'P1' AS PACKAGE
UNION ALL
SELECT 'P2'
) Y
WHERE
X.PACKAGE = 'P5';