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