0

TL;博士

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


我有一个在 SQL Server 2012 上运行的三个临时表的查询。

第一个临时表 ( #HRData) 保存 HR 信息。在 a 之后SELECTFULL OUTER JOINS它以 a 结尾,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 JOINSin#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 语句之间传递变量。那么如何确保在相关三列中输入的电话号码是唯一值呢?非常感谢您提供的所有帮助。

4

1 回答 1

1

您是否尝试过在其中删除定义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
于 2020-04-09T22:07:11.253 回答