You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无关联双表查询求助:编写Sessions与User表的联合查询语句

哦,我明白你遇到的问题了——你一开始用了UNION,但这其实不是你需要的操作!UNION是用来把两个结构相同的结果集合并到一起,而你的需求是把会话记录和对应的用户信息关联起来,这时候应该用JOIN来连接两张表,因为它们之间有UserID(Sessions表)和ID(User表)这个关联字段呀。

正确的查询思路

首先明确核心关联逻辑:Sessions.UserID对应User.ID,这是唯一能把两张表联系起来的纽带。接下来我们通过JOIN关联两张表,同时筛选出近一个月的会话记录。

推荐:动态日期查询(适配当前时间)

这种写法不用手动修改日期,每次运行都会自动计算近一个月的范围:

SELECT 
    s.StartDate,
    u.FullName,
    u.UPN
FROM 
    Sessions s
INNER JOIN 
    User u ON s.UserID = u.ID
WHERE 
    s.StartDate >= DATEADD(month, -1, GETDATE())
    AND s.StartDate <= GETDATE();

代码说明:

  • 给表起别名s(代表Sessions)和u(代表User),让代码更简洁易读;
  • INNER JOIN确保只有同时在两张表中存在匹配记录的行才会被返回(也就是有对应用户信息的会话);
  • DATEADD(month, -1, GETDATE())自动计算当前日期往前推1个月的日期,避免硬编码的麻烦。

硬编码日期版本(适合测试或固定范围)

如果你需要用固定的日期范围(比如你原来写的20180306到20180406),可以这样写:

SELECT 
    s.StartDate,
    u.FullName,
    u.UPN
FROM 
    Sessions s
INNER JOIN 
    User u ON s.UserID = u.ID
WHERE 
    s.StartDate >= '20180306'
    AND s.StartDate <= '20180406';

额外补充

  • 如果你想保留所有符合日期范围的会话,哪怕没有对应用户信息(User表中无匹配UserID的行),可以把INNER JOIN换成LEFT JOIN,此时无匹配的FullName和UPN会显示为NULL;
  • 不同数据库的日期函数略有差异:
    • MySQL:把DATEADD(month, -1, GETDATE())换成DATE_SUB(CURDATE(), INTERVAL 1 MONTH);
    • PostgreSQL:换成NOW() - INTERVAL '1 month'。

内容的提问来源于stack exchange,提问作者Jafet Melichar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:26:43