【问题标题】:How to join 3 tables to a single table in SQL如何在 SQL 中将 3 个表连接到单个表
【发布时间】:2014-11-25 09:47:35
【问题描述】:

我需要将 3 个表连接到一个表中。这是场景。

表1:有user_id、app_id

表 2:有 user_id、gender

表 3:有 app_id、app_name(PC、Mobile)

表 4:有 user_id、user_city

现在我正在寻找按城市分组的移动男性、移动女性、PC 男性、PC 女性的用户数。

这是我的 SQL。但是,我想我在连接上做错了。请纠正我。

SELECT
    t4.user_city,
    sum(case when t2.gender = 'm' and t3.app_name = 'PC' then 1 else 0 end) pcmale,
    sum(case when t2.gender = 'f' and t3.app_name = 'PC' then 1 else 0 end) pcfemale,
    sum(case when t2.gender = 'm' and t3.app_name = 'Mobile' then 1 else 0 end) mobilemale,
    sum(case when t2.gender = 'm' and t3.app_name = 'Mobile' then 1 else 0 end) mobilefemale,
FROM
    table1 t1
    inner join
    table2 t2 on t1.user_id = t2.user_id
    inner join
    table3 t3 on t1.app_id = t3.app_id
    inner join
    table4 t4 on t1.user_id = t4.user_id
GROUP BY 1

我们可以按照我在查询中所做的方式将多个表连接到一个表中吗?请帮忙

【问题讨论】:

  • 它运行。我只是不确定我是否做得正确并得到正确的结果。您是否发现将多个表连接到 t1 表的方法存在任何问题?
  • 移动女性应该检查 f,你正在检查 m,组应该在 t4.user_city
  • 那么你得到了什么结果?
  • @radar 组已经在 t4.user_city
  • 连接似乎是正确的,除此之外,正如 Rob Paller 已经提到的,由于使用了 INNER JOIN,一些数据可能会丢失。考虑将逻辑转移到 LEFT OUTER JOIN。为什么你认为连接不正确?如果您收到一些不正确的结果,那么提及确切的问题会有所帮助。

标签: sql teradata


【解决方案1】:

是的。你的连接是正确的。

如果 T1 中的某个值在 T2、T3 或 T4 中不存在,它将被排除在您的结果之外。这是因为你写的JOININTERSECTION。例如,如果 T1 中的一行具有 app_id = '99' 的值,而 T2 中的 app_id 没有相应的值 '99',则它不会在您编写的 SQL 中返回。

在这些情况下,如果您想返回 T1 中包含 'u' 的行,则需要编写一个 'LEFT OUTER JOIN' 来返回 LEFT 表中的所有记录以及 RIGHT 表中的匹配记录.例如,T1 的 app_id 值为“99”,您将在 T3 中获得 app_name 的 NULL 值。

这是查询中JOIN 逻辑的过度简化示例,但希望对您有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-02
    • 1970-01-01
    • 2012-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-28
    相关资源
    最近更新 更多