sql - 如何在多个表中查找不同的用户

标签 sql postgresql join distinct exists

我有一个名为 users 的表,其中包含用户 ID,还有一些表,例如 cloud_storage_acloud_storage_bcloud_storage_c。如果用户存在于 cloud_storage_a 中,则意味着他们已连接到云存储 a。一个用户也可以存在于多个云存储中。这是一个例子:

用户表:

user_id | address      | name
-------------------------------
123     | 23 Oak Ave   | Melissa
333     | 18 Robson Rd | Steve
421     | 95 Ottawa St | Helen
555     | 12 Highland  | Amit
192     | 39 Anchor Rd | Oliver

cloud_storage_a:

user_id
-------
 421
 333

cloud_storage_b:

user_id
-------
 555

cloud_storage_c:

user_id
-------
 192
 555

等等

我想创建一个查询来获取所有连接到任何云存储的用户。因此对于此示例,应返回用户 421、333、555、192。我猜这是某种联接,但我不确定是哪一种。

最佳答案

你很接近。您想使用 UNION 将记录集/表堆叠在彼此之上,而不是基于键将彼此相邻的表合并的 JOIN。

SELECT user_id FROM cloud_storage_a
UNION
SELECT user_id FROM cloud_storage_b
UNION
SELECT user_id FROM cloud_storage_c

在此处使用关键字 UNION 将为所有三个表提供不同的 user_id。如果您将其切换为 UNION ALL,您将不再获得 Distinct,这在其他情况下具有优势(显然不是在这里)。

编辑添加:

如果你想引入用户地址,你可以使用这个东西作为子查询并加入你的用户表:

SELECT
    subunion.user_id
    user.address
FROM
    user
    INNER JOIN
        (
            SELECT user_id FROM cloud_storage_a
            UNION
            SELECT user_id FROM cloud_storage_b
            UNION
            SELECT user_id FROM cloud_storage_c
        ) subunion ON
            user.user_id = subunion.user_id

随着您添加更多 cloud_storage_N 表,该联合将需要增长。总而言之,这不是一个很棒的数据库设计。您最好创建一个 cloud_storage 表并有一个字段来描述它是 abc , ... ,N

那么您的 UNION 查询将只是SELECT DISTINCT user_id FROM cloud_storage;,您永远不需要再次编辑它。

关于sql - 如何在多个表中查找不同的用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33244910/

相关文章:

php - 如何使用 PHP 将 MySQL 表备份到转储中?

postgresql - 在 plpgsql 函数中锁定表

arrays - Twig 模板 : Add html in JOIN function

java - 调试 hibernate 配置的工具

mysql - 同一查询中不同列的多个求和

mysql 计算包含 LEFT JOIN 的查询中的行数挂起服务器

sql - 计算每个客户订单之间的平均时间

java - 在 java 存储过程中创建 java.sql.blob 实例

php - 如何获得最高投票的图像路径

sql - postgresql - 尝试将变量从命令行传递到 sql 脚本时出错