解密 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';