首页 > 解决方案 > SQL - 连接语句拼图

问题描述

在这里解谜!

我有一个名为 的表whitelist,一个名为 的表bans。每个用户都由一个标识符标识。用户可能是:

如果用户被禁止,则在禁止表中创建一行。如果用户被列入白名单,则会在白名单表中创建一行。

我有这个 acual SQL 语句来检查用户是否被禁止或列入白名单: SELECT * FROM whitelist FULL JOIN bans ON bans.identifier=whitelist.id

问题是:如果用户未列入白名单,whitelist.id则不存在(显然)。但是如何处理所有情况呢?

提前致谢。

标签: sql

解决方案


我将假设您有一个用户表。根据您的 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

推荐阅读