Запрос с тремя временными таблицами, которые не могут быть объединены, не может передавать данные между операторами регистра (ошибка многоэлементного идентификатора) - PullRequest
0 голосов
/ 10 апреля 2020

TL; DR

Мой запрос содержит три временные таблицы из-за множества смягчающих факторов, описанных в посте ниже. Я не знаю, как объединить временные таблицы в одну временную таблицу для передачи информации между двумя инструкциями case. Также у меня нет способа передать информацию между операторами case, поскольку SET @variable = CASE вызывает ошибку «Не удалось связать идентификатор из нескольких частей». Поэтому мне нужен способ рефакторинга или изменения моего запроса, чтобы разрешить передачу информации из одного оператора Case в другой.


У меня есть запрос с тремя временными таблицами, работающими на SQL Server 2012.

Первая временная таблица (#HRData) содержит информацию о ЧСС. После 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) имеет дело с проблемным выбором архитектуры базы данных, который был сделан пару десятилетий go. Он содержит номера телефонов (все в одной таблице), но идентификаторы этих записей не привязаны к отдельным лицам. Они привязаны к физическим адресам в таблице адресов с идентификаторами адресов. Код для этого:

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 из-за проблемы «Не удалось связать многокомпонентный идентификатор». Итак, как я могу убедиться, что номера телефонов, введенные в три столбца, являются уникальными значениями? Мы очень ценим любую помощь.

1 Ответ

1 голос
/ 10 апреля 2020

Вы пытались просто удалить весь оператор 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...