У меня есть таблица, в которой я определяю, существует ли идентификационный номер человека в нескольких базах данных. Если идентификатор существует только в одной базе данных, я хотел бы добавить еще один столбец, который помечает человека как «УНИКАЛЬНЫЙ»; в противном случае он должен быть помечен как «НЕ УНИКАЛЬНЫЙ».
Мой запрос на данный момент настроен так:
/* CTE that creates a long column of all distinct PersonID's across three databases */
WITH cte as
(SELECT DISTINCT t1.*
FROM
(SELECT PersonID FROM DB_1.dbo.Persons
UNION
SELECT PersonID FROM DB_2.dbo.Persons
UNION
SELECT PersonID FROM DB_3.dbo.Persons)
t1)
/* Use CASE WHEN statements to check if Person exists in three other tables in DB_1, DB_2, and DB_3 */
SELECT PersonID,
CASE WHEN PersonID IN (SELECT PersonID FROM DB_1.dbo.Table_1
UNION
SELECT PersonID FROM DB_1.dbo.Table_2
UNION
SELECT PersonID FROM DB_1.dbo.Table_3)
THEN 'TRUE'
ELSE 'FALSE'
END AS IN_DB_1,
CASE WHEN PersonID IN (SELECT PersonID FROM DB_2.dbo.Table_1
UNION
SELECT PersonID FROM DB_2.dbo.Table_2
UNION
SELECT PersonID FROM DB_2.dbo.Table_3)
THEN 'TRUE'
ELSE 'FALSE'
END AS IN_DB_2,
CASE WHEN PersonID IN (SELECT PersonID FROM DB_3.dbo.Table_1
UNION
SELECT PersonID FROM DB_3.dbo.Table_2
UNION
SELECT PersonID FROM DB_3.dbo.Table_3)
THEN 'TRUE'
ELSE 'FALSE'
END AS IN_DB_3
FROM cte
Результаты выглядят так:
PersonID IN_DB_1 IN_DB_2 IN_DB_3
---------|----------|----------|----------|
001 TRUE FALSE FALSE
002 FALSE TRUE TRUE
003 TRUE FALSE FALSE
004 FALSE TRUE FALSE
005 TRUE FALSE TRUE
Как видно, номера PersonID 001, 003 и 004 появляются только в одной базе данных. Я хотел бы добавить пятый столбец с именем «PID_UNIQUE», который подсчитывает количество текстовых значений «ИСТИНА» в столбцах и указывает, является ли человек уникальным.
Он должен выглядеть следующим образом:
PersonID IN_DB_1 IN_DB_2 IN_DB_3 PID_UNIQUE
---------|----------|----------|----------|-----------|
001 TRUE FALSE FALSE UNIQUE
002 FALSE TRUE TRUE NOT UNIQUE
003 TRUE FALSE FALSE UNIQUE
004 FALSE TRUE FALSE UNIQUE
005 TRUE FALSE TRUE NOT UNIQUE
Я предполагаю, что это будет настроено с использованием другого выражения CASE WHEN. Я немного застрял в том, как я мог бы написать это, чтобы сосчитать через три столбца "IN_DB_no".
Я попробовал это:
CASE WHEN COUNT('TRUE') = 1
THEN 'UNIQUE'
ELSE 'NOT UNIQUE'
END AS PID_UNIQUE
Однако он вернул столбец, в котором все записи были уникальными, а это не то, что мне нужно.