【发布时间】:2020-03-19 21:38:09
【问题描述】:
我有一个表,我在其中确定一个人的 ID 号是否存在于多个数据库中。如果 ID 仅存在于一个数据库中,那么我想添加另一列,将该人标记为“唯一”;否则,它应该被标记为“NOT UNIQUE”。
到目前为止,我的查询是这样设置的:
/* 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”的第五列,它计算各列中“TRUE”文本值的数量并指定此人是否是唯一的。
应该是这样的:
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
但是,它返回了一个所有记录都是唯一的列,这不是我需要的。
【问题讨论】:
-
。 .您的查询引用了 3 个数据库中的 6 个表。那些桌子是什么?
-
@GordonLinoff 这些不是真正的数据库,因为实际信息是保密的。这样做的目的是创建一个表,在一个或多个数据库中提供人员及其存在之间的 TRUE/FALSE 比较。这样我们就可以在上传更多数据时识别任何潜在的合并问题。这组数据库中引用的三个表只是关于我使用 PersonID 列比较的那些人的其他类型的特定数据。我要求第五张表的原因是,当我查询该表时,我可以指定所有唯一的人。
-
@GordonLinoff 基本上,我真正想弄清楚的是如何计算一行而不是一列的值。 COUNT() 返回与列中的条件匹配的行数。我正在尝试计算表中每条记录的每一行中出现“TRUE”一词的次数。如果只有一次,则第五列应为该记录显示“UNIQUE”。
标签: sql sql-server database case-when