SQL 查询有条件地连接来自不同数据库的列

Posted

技术标签:

【中文标题】SQL 查询有条件地连接来自不同数据库的列【英文标题】:SQL Query to conditionally join columns from different databases 【发布时间】:2019-09-03 19:58:58 【问题描述】:

我正在将数据从旧数据库迁移到新数据库。我的目标是将用户的权限从旧数据库移动到新数据库。新旧数据库都已经有匹配的用户 ID。

问题在于旧数据库对于每个用户的权限都有多行(例如,用户 #3 可能有 5 行具有不同权限集,具体取决于表第二列中的组织 ID。

我该怎么做:

仅对每个用户的最高权限填充新表('Admin' 为最高权限,'Read' 权限为最低权限)

OLD_DB 用户表:

ID     ORG     ADMIN   EDIT    READ
1       43       0       1      0
1       200      1       0      0
1       76       0       0      1
2       43       0       1      0
2       76       0       0      1

NEW_DB 用户表:

ID     LEVEL
1        0
2        0
3        0
4        0
5        0

NEW_DB 用户表目标:

ID     LEVEL
1      ADMIN
2      EDIT
3      READ
4      READ
5      EDIT

我对用户“ORG”关系不再感兴趣,只想要他们的最高权限级别。

我正在使用 Sequel Pro,它可能会在其 GUI 中提供解决方案,但我不知道。我最近尝试获取管理员用户的代码(没有运气)是:

SELECT admin FROM old_db.user oldpermission
JOIN scope FROM homestead_test.users newpermission
ON oldpermission.ID = newpermission.ID;

【问题讨论】:

这有点棘手,因为您需要的值可能位于三个不同列之一中。我可能会做三个不同的查询。首先,将所有内容更改为 READ。然后检查编辑是否为真,如果是,则将这些行更改为编辑。然后检查 admin 是否为真。如果是这样,请将这些行更改为 ADMIN 【参考方案1】:
 SELECT ID, CASE WHEN MAX(ADMIN) = 1 THEN 'ADMIN'
                 WHEN MAX(EDIT)  = 1 THEN 'EDIT'
                 WHEN MAX(READ)  = 1 THEN 'READ'
            END as LEVEL
 FROM OLD_DB 
 GROUP BY ID

你可能可以将最后一个简化为

 ELSE 'READ'

因为,如果前 2 次失败,则只有 READ 权限可用

【讨论】:

以上是关于SQL 查询有条件地连接来自不同数据库的列的主要内容,如果未能解决你的问题,请参考以下文章

利用SQL索引提高查询速度

如何有条件的更新sql 数据表中的列值?

01-多表查询

SQL 查询连接来自不同 fdb 数据库的表

数据库(MYSQL)连接查询--sql92等值连接

在 Rails 上为连接、限制、选择等(不是条件)的 SQL 片段安全地转义字符串