无法合并三个临时表的查询无法在case语句之间传递数据(多部分标识符错误)

问题描述 投票:0回答:1

TL; DR

由于以下帖子中所述的许多缓解因素,我的查询具有三个临时表。我不知道将临时表合并到单个临时表中以在两个case语句之间传递信息的方法。由于SET @variable = CASE引发“无法绑定多部分标识符”错误,因此我也没有办法在case语句之间传递信息。因此,我需要一种重构或更改查询的方法,以允许信息从一个Case语句传递到另一个Case语句。


我有一个查询,其中包含在SQL Server 2012上运行的三个临时表。

第一个临时表(#HRData)保存HR信息。在以SELECT为特征的FULL OUTER JOINS之后,以CTE结尾,该删除使用以下命令删除不需要的行:

RN = ROW_NUMBER()OVER(PARTITION BY P.LastName ORDER BY P.LastName, P.PhoneTypeID DESC)
   FROM #TempPhones P
)
DELETE FROM CTE WHERE RN > 1

此SQL代码通过这些步骤来为每个人隔离特定的电话号码,由于业务规则,这些电话号码可能来自多种电话号码。

第二个临时表(#SecondaryPhones)处理了几十年前做出的麻烦的数据库体系结构选择。它包含电话号码(都在一个表中),但是这些记录的ID并不与个人相关。它们通过地址ID绑定到地址表中的物理地址。此代码是:

SELECT H.PersonnelID, P.LastName, P.FirstName, PH.PhoneNumber, H.Addr1, H.AddrDesc, PHT.PhoneTypeDesc, PH.PhoneTypeID
INTO #SecondaryPhones
FROM Home H
INNER JOIN Personnel P ON H.PersonnelID = P.PersonnelID
INNER JOIN Phone PH ON H.HomeAddrID = PH.HomeAddrID
LEFT OUTER JOIN PhoneType PHT ON PH.PhoneTypeID = PHT.PhoneTypeID
ORDER BY H.PersonnelID, PH.PhoneNumber;

WITH FinalTable AS (
SELECT SP.PeopleID, SP.PhoneNumber, SP.LastName, SP.FirstName, SP.PhoneTypeDesc,
ROW_NUMBER() OVER (Partition BY PeopleID ORDER BY SP.LastName, SP.PhoneTypeDesc ASC) n
FROM #SecondaryPhones SP )

由于FULL OUTER JOINS中的#HRData和通过ROW_NUMBER()OVER(PARTITION BY....)进行的不同排序,我不知道一种连接这两个临时表的方法,该方法无法隔离第一个临时表中的唯一电话号码并收集第二个临时表中的电话列表。

第三个临时表从#SecondaryPhones中获取数据,并创建包含一个人的所有电话号码的行:

SELECT a.PersonnelID, a.LastName, a.FirstName, a.PhoneNumber as Phone1, b.PhoneNumber as Phone2, c.PhoneNumber as Phone3
INTO #FinalSecondaryPhones
FROM FinalTable a 
LEFT JOIN FinalTable b ON b.PeopleID=a.PeopleID AND b.n=2
LEFT JOIN FinalTable c ON c.PeopleID=b.PeopleID AND c.n=3
WHERE a.n=1
ORDER BY PersonnelID

当我做最后一个SELECT DISTINCT时,我从HRData中选择了许多列,然后添加此代码:

-- This Case statement works fine
CASE
    WHEN FSP.Phone1 != HRD.PrimaryMobilePhone
    THEN FSP.Phone1
ELSE
    FSP.Phone2
END AS PersonalPhone,

-- See When statement for issue
CASE
    WHEN (FSP.Phone2 != HRD.PrimaryMobilePhone) AND (FSP.Phone2 != --Need value of PersonalPhone from previous Case Statement here) 
    THEN FSP.Phone2
ELSE
    FSP.Phone3
END AS AdditionalPersonalPhone

FROM #HRData HRD 
LEFT OUTER JOIN #FinalSecondaryPhones FSP ON FSP.PersonnelID = HRD.PersonnelID
LEFT OUTER JOIN Dept D ON D.DeptID = HRD.DeptID

由于业务数据输入规则,数据库体系结构和非常老的数据输入应用程序(用ColdFusion 5编写)放大了人为错误,我正在使用这些case语句消除重复项,并且需要第一个结果进行比较第二。我怀疑将这些临时表组合在一起可能会提供解决方案,但看不到如何做到这一点。而且由于“无法绑定多部分标识符”问题,我无法在case语句之间传递变量。那么,如何确定在上述三列中输入的电话号码是唯一值?非常感谢提供的所有帮助。

sql sql-server tsql
1个回答
0
投票

您是否尝试过在其中删除定义PersonalPhone的整个CASE语句?

SELECT
-- This Case statement works fine
    CASE
        WHEN FSP.Phone1 <> HRD.PrimaryMobilePhone THEN
            FSP.Phone1
        ELSE
            FSP.Phone2
    END AS PersonalPhone
    -- See When statement for issue
    , CASE
        WHEN (FSP.Phone2 <> HRD.PrimaryMobilePhone)
                AND (FSP.Phone2 <> CASE
                                    WHEN FSP.Phone1 <> HRD.PrimaryMobilePhone THEN
                                        FSP.Phone1
                                    ELSE
                                        FSP.Phone2
                                END
                    ) THEN
            FSP.Phone2
        ELSE
            FSP.Phone3
    END AS AdditionalPersonalPhone
FROM #HRData HRD
LEFT OUTER JOIN #FinalSecondaryPhones FSP ON FSP.PersonnelID = HRD.PersonnelID
LEFT OUTER JOIN Dept D ON D.DeptID = HRD.DeptID
© www.soinside.com 2019 - 2024. All rights reserved.