sql - SQL - 连接语句拼图
问题描述
在这里解谜!
我有一个名为 的表whitelist
,一个名为 的表bans
。每个用户都由一个标识符标识。用户可能是:
- 未禁止,未列入白名单。
- 禁止,未列入白名单。
- 没有被禁止,被列入白名单。
- 禁止,列入白名单。
如果用户被禁止,则在禁止表中创建一行。如果用户被列入白名单,则会在白名单表中创建一行。
我有这个 acual SQL 语句来检查用户是否被禁止或列入白名单:
SELECT * FROM whitelist FULL JOIN bans ON bans.identifier=whitelist.id
。
问题是:如果用户未列入白名单,whitelist.id
则不存在(显然)。但是如何处理所有情况呢?
提前致谢。
解决方案
我将假设您有一个用户表。根据您的 RDBMS,您可以使用存在或联接。这将允许您检查用户记录是否存在于禁令或白名单中。
使用存在来检查该用户是否出现在任一表中:
SELECT u.*
FROM user u
WHERE EXISTS (
SELECT 1
FROM whitelist wl
ON wl.userID = u.userid)
OR EXISTS (
SELECT 1
FROM ban b
WHERE b.userid = u.userID)
或者您可以使用连接并检查 NULLS,然后有条件地将 NULL 更改为 1 或 0、是或否等:
SELECT u.*, wl.userID, b.userID
FROM user u
LEFT JOIN whitelist wl
ON wl.userID = u.userID
LEFT JOIN ban b
ON b.userID = u.userid
WHERE wl.userID IS NOT NULL
or b.userID IS NOT NULL
推荐阅读
- batch-file - 无法将具有多个特殊字符的字符串传递给批处理脚本中的变量
- r - R dplyr过滤器功能每隔一行删除
- text - 是否可以仅对 13 个类中的一个类进行过度采样?
- file - Rust - 开放的动态作者数量
- c++ - 为什么 Boost.Hana 使用宏来打开/关闭命名空间?
- spring-boot - 无法从 GKE 访问数据存储区资源
- django - 为什么 django 在创建 Post Model 时更改时区?
- css - 是否有任何选项可以将此应用程序放在页面中间?
- swift - ios - 等待 24 小时发送通知
- bash - 如果单引号和双引号已被使用,则 find -exec 的解决方案