Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 三个临时表无法组合的查询无法在case语句之间传递数据(多部分标识符错误)_Sql_Sql Server_Tsql - Fatal编程技术网

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

Sql 三个临时表无法组合的查询无法在case语句之间传递数据(多部分标识符错误),sql,sql-server,tsql,Sql,Sql Server,Tsql,TL;博士 我的查询有三个临时表,这是由于下文中描述了许多缓解因素。我不知道如何将临时表组合成一个临时表,以便在两个case语句之间传递信息。我也没有办法在case语句之间传递信息,因为SET@variable=case会引发多部分标识符无法绑定的错误。因此,我需要一种重构或修改查询的方法,以允许信息从一个Case语句传递到另一个Case语句 我有一个查询,其中有三个临时表在SQL Server 2012上运行 第一个临时表HRData保存人力资源信息。在以完全外部联接为特征的选择之后,它以CT

TL;博士

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

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

第一个临时表HRData保存人力资源信息。在以完全外部联接为特征的选择之后,它以CTE结束,该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 )
由于HRData中的完整外部联接以及通过行\号的不同排序,由。。。。我不知道如何连接这两个临时表,以便在第一个临时表中隔离唯一的电话号码,并在第二个临时表中收集电话列表

第三个临时表从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
当我进行最终选择时,我从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语句之间传递变量,因为多部分标识符无法绑定。那么,我如何确保在这三列中输入的电话号码是唯一的值呢?非常感谢您提供的所有帮助。

您是否尝试过将定义PersonalPhone的整个案例陈述放在这里

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

从句法上说,我认为这应该行得通。从逻辑上讲,我不太确定。然而,我会让OP来判断这一点。从语法和逻辑上都有效!谢谢你,艾萨克!有时候你只需要另一双眼睛。我真的看了太久的代码了。非常感谢。我很难找到包含大小写表达式和相应完整错误消息的语句。没有这些,帮助你就困难多了。