如何在sql中连接多个表

如何在sql中连接多个表,sql,postgresql,inner-join,Sql,Postgresql,Inner Join,嗨,朋友们,我有3张表加满、取款和转账。这3张表属于用户表。我必须找到所有属于用户的记录。我尝试了使用内部联接,如下所示:- SELECT * FROM users u INNER JOIN topups t ON u.id = t.user_id INNER JOIN withdraws w ON u.id = w.user_id INNER JOIN transfers tf ON u.id = tf.user_id 但是这个查询只返回3个表之间的公共记录。我必须为每个表找到属

嗨,朋友们,我有3张表加满、取款和转账。这3张表属于用户表。我必须找到所有属于用户的记录。我尝试了使用内部联接,如下所示:-

SELECT * FROM users u
INNER JOIN topups t
  ON u.id = t.user_id
INNER JOIN withdraws w
  ON u.id = w.user_id
INNER JOIN transfers tf
  ON u.id = tf.user_id
但是这个查询只返回3个表之间的公共记录。我必须为每个表找到属于用户的所有记录

假设我在补足中有2条记录属于用户id 1,在取款中有3条记录属于用户id 2,在转账中有5条记录属于用户id 3,那么我应该得到总共10条记录

样本数据:-

加满

+--------+---------+---------+
| amount | result  | user_id |
+--------+---------+---------+
|     10 | success |       1 |
|     20 | failed  |       2 |
+--------+---------+---------+
+---------+----------+
|w_amount |  user_id |
+---------+----------+
|     10  |        1 |
|     20  |        2 |
|     30  |       10 |
+---------+----------+
+--------+--------+---------+
| method | amount | user_id |
+--------+--------+---------+
| abc    |     10 |       3 |
| xyz    |     20 |       4 |
+--------+--------+---------+
+----+---------+--------+
| id |  f_name | l_name |
+----+---------+--------+
|  1 |    abc  |    xyz |
|  2 |    abc  |    xyz |
|  3 |    abc  |    xyz |
|  4 |    abc  |    xyz |
|  5 |    abc  |    xyz |
|  6 |    abc  |    xyz |
+----+---------+--------+
退出

+--------+---------+---------+
| amount | result  | user_id |
+--------+---------+---------+
|     10 | success |       1 |
|     20 | failed  |       2 |
+--------+---------+---------+
+---------+----------+
|w_amount |  user_id |
+---------+----------+
|     10  |        1 |
|     20  |        2 |
|     30  |       10 |
+---------+----------+
+--------+--------+---------+
| method | amount | user_id |
+--------+--------+---------+
| abc    |     10 |       3 |
| xyz    |     20 |       4 |
+--------+--------+---------+
+----+---------+--------+
| id |  f_name | l_name |
+----+---------+--------+
|  1 |    abc  |    xyz |
|  2 |    abc  |    xyz |
|  3 |    abc  |    xyz |
|  4 |    abc  |    xyz |
|  5 |    abc  |    xyz |
|  6 |    abc  |    xyz |
+----+---------+--------+
传输

+--------+---------+---------+
| amount | result  | user_id |
+--------+---------+---------+
|     10 | success |       1 |
|     20 | failed  |       2 |
+--------+---------+---------+
+---------+----------+
|w_amount |  user_id |
+---------+----------+
|     10  |        1 |
|     20  |        2 |
|     30  |       10 |
+---------+----------+
+--------+--------+---------+
| method | amount | user_id |
+--------+--------+---------+
| abc    |     10 |       3 |
| xyz    |     20 |       4 |
+--------+--------+---------+
+----+---------+--------+
| id |  f_name | l_name |
+----+---------+--------+
|  1 |    abc  |    xyz |
|  2 |    abc  |    xyz |
|  3 |    abc  |    xyz |
|  4 |    abc  |    xyz |
|  5 |    abc  |    xyz |
|  6 |    abc  |    xyz |
+----+---------+--------+
用户

+--------+---------+---------+
| amount | result  | user_id |
+--------+---------+---------+
|     10 | success |       1 |
|     20 | failed  |       2 |
+--------+---------+---------+
+---------+----------+
|w_amount |  user_id |
+---------+----------+
|     10  |        1 |
|     20  |        2 |
|     30  |       10 |
+---------+----------+
+--------+--------+---------+
| method | amount | user_id |
+--------+--------+---------+
| abc    |     10 |       3 |
| xyz    |     20 |       4 |
+--------+--------+---------+
+----+---------+--------+
| id |  f_name | l_name |
+----+---------+--------+
|  1 |    abc  |    xyz |
|  2 |    abc  |    xyz |
|  3 |    abc  |    xyz |
|  4 |    abc  |    xyz |
|  5 |    abc  |    xyz |
|  6 |    abc  |    xyz |
+----+---------+--------+
预期产出

+--------+---------+---------+----------+---------+
| amount | result  | user_id | w_amount |  method |
+--------+---------+---------+----------+---------+
|     10 | success |       1 |          |         |
|     20 | failed  |       2 |          |         |
|        |         |       1 |       10 |         |
|        |         |       2 |       20 |         |
|        |         |       3 |          | abc     |
|        |         |       4 |          | xyz     |
+--------+---------+---------+----------+---------+

请提前感谢。

您可以使用
左连接
s而不是
内部连接
s:

SELECT * FROM users u
LEFT JOIN topups t
  ON u.id = t.user_id
LEFT JOIN withdraws w
  ON u.id = w.user_id
LEFT JOIN transfers tf
  ON u.id = tf.user_id

左图将他们加入到用户和数字中,这样做很有效

SELECT 
 tup.amount, tup.result, 
 usr.id as user_id, 
 wd.w_amount, 
 trans.method
FROM users usr
CROSS JOIN (SELECT generate_series n FROM generate_series(1, 3)) AS nr
LEFT JOIN topups tup ON tup.user_id = usr.id AND nr.n = 1
LEFT JOIN withdraws wd ON wd.user_id = usr.id AND nr.n = 2
LEFT JOIN transfers trans ON trans.user_id = usr.id AND nr.n = 3
WHERE (tup.user_id IS NOT NULL OR wd.user_id IS NOT NULL OR trans.user_id IS NOT NULL)
ORDER BY tup.user_id, wd.user_id, trans.user_id
测试一下

额外:


基于注释的变体

请提供示例数据和所需结果。@awsmsid。你的问题不清楚。有多次尝试来回答这个问题,而你似乎拒绝了所有的尝试。没有样本数据、期望的结果和良好的解释,就没有办法回答。陌生人看不懂你的心思。我已经提供了样本数据,请现在检查。对我来说,看起来像一个坏了的数据库。当没有具有该ID的用户时,用户10的取款记录如何存在?这似乎没有道理,应该通过应用适当的外键来实现。@ThorstenKettner为什么用户10的记录不存在?如果我为用户10创建了一个撤销记录并从用户表中删除了该用户,会怎么样?还有一个场景可以在这里假设没有用户id的情况下退出。请不要对该问题投反对票。这是一个有效的问题我有相同的场景。这就是我发布此问题的原因。我尝试了,但它不起作用。它返回所有不属于userscan的记录。我将两列的值合并为一列。假设向用户id 1添加和提取以下内容,并且两者都有update_at,那么我想将updated_at的值(tup.updated_at,,,,wd.updated_at)合并为updated_at,但每次我在“2018-10-15 12:16:09.799762,,,”或“,,2018-10-29 19:06:13.814336”等处获取updated_的单个值时,它都不包含该值我正在尝试连接3个表的更新位置,我可能会选择
连接位置(',',tup.updated\u at,wd.updated\u at)
。但是您希望将表分开,因此这两个值位于不同的行上。
合并(tup.updated\u at,wd.updated\u at,trans.updated\u at)
将在该设置中工作,如果您只希望在“@awsmsid”处有1个“updated\u”,则问题是每个表每个用户id都有多个记录。并且为了避免笛卡尔乘积联接(并生成许多行)你需要加入一些额外的内容。看看这个。基本上,它会加入用户id和数量的子查询组。这是我能得到的最接近你尝试做的事情。