Sql 三个临时表无法组合的查询无法在case语句之间传递数据(多部分标识符错误)
TL;博士 我的查询有三个临时表,这是由于下文中描述了许多缓解因素。我不知道如何将临时表组合成一个临时表,以便在两个case语句之间传递信息。我也没有办法在case语句之间传递信息,因为SET@variable=case会引发多部分标识符无法绑定的错误。因此,我需要一种重构或修改查询的方法,以允许信息从一个Case语句传递到另一个Case语句 我有一个查询,其中有三个临时表在SQL Server 2012上运行 第一个临时表HRData保存人力资源信息。在以完全外部联接为特征的选择之后,它以CTE结束,该CTE使用以下方法删除不需要的行:Sql 三个临时表无法组合的查询无法在case语句之间传递数据(多部分标识符错误),sql,sql-server,tsql,Sql,Sql Server,Tsql,TL;博士 我的查询有三个临时表,这是由于下文中描述了许多缓解因素。我不知道如何将临时表组合成一个临时表,以便在两个case语句之间传递信息。我也没有办法在case语句之间传递信息,因为SET@variable=case会引发多部分标识符无法绑定的错误。因此,我需要一种重构或修改查询的方法,以允许信息从一个Case语句传递到另一个Case语句 我有一个查询,其中有三个临时表在SQL Server 2012上运行 第一个临时表HRData保存人力资源信息。在以完全外部联接为特征的选择之后,它以CT
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来判断这一点。从语法和逻辑上都有效!谢谢你,艾萨克!有时候你只需要另一双眼睛。我真的看了太久的代码了。非常感谢。我很难找到包含大小写表达式和相应完整错误消息的语句。没有这些,帮助你就困难多了。