无关联双表查询求助:编写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'。
- MySQL:把
内容的提问来源于stack exchange,提问作者Jafet Melichar
相关产品推荐
相关产品推荐

