JOIN后的多表查询咨询:基于4张数据表的SQL查询需求
嘿,我来帮你搞定这个多表JOIN查询的问题!先看你的表结构,TB1和TB2都有uniqueid字段,这就是我们关联两张表的关键啦。下面我会结合不同的业务场景,给你具体的实现方法:
1. 内连接(INNER JOIN):只取两张表匹配的记录
这种方式会返回TB1和TB2中uniqueid完全匹配的记录,简单说就是“两边都有的数据才会被选出来”。适合你需要同时查看两张表对应关联数据的场景。
SELECT tb1.uniqueid, tb1.datetime_entry, tb1.field_0, tb2.datetime_inti, tb2.datetime_end, tb2.id_emp FROM TB1 tb1 INNER JOIN TB2 tb2 ON tb1.uniqueid = tb2.uniqueid;
我给表起了tb1和tb2的别名,写SQL的时候更省事。你可以根据自己的需求,在SELECT后面增减需要的字段哦。
2. 左连接(LEFT JOIN):保留TB1的所有记录
如果想保留TB1里的全部数据,哪怕TB2里没有对应的uniqueid,就用左连接。这时候TB2中没有匹配的字段会显示为NULL,你也可以用函数把NULL换成友好提示。
SELECT tb1.uniqueid, tb1.datetime_entry, tb1.field_0, COALESCE(tb2.datetime_inti, '无对应数据') AS datetime_inti, -- 替换NULL为自定义文本 tb2.datetime_end, tb2.id_emp FROM TB1 tb1 LEFT JOIN TB2 tb2 ON tb1.uniqueid = tb2.uniqueid;
3. 右连接(RIGHT JOIN):保留TB2的所有记录
和左连接刚好相反,右连接会保留TB2的全部数据,TB1中没有匹配的字段会显示NULL。适合你想优先查看TB2数据,同时关联TB1信息的场景。
SELECT tb1.uniqueid, tb1.datetime_entry, tb1.field_0, tb2.datetime_inti, tb2.datetime_end, tb2.id_emp FROM TB1 tb1 RIGHT JOIN TB2 tb2 ON tb1.uniqueid = tb2.uniqueid;
4. 带筛选条件的JOIN查询
如果还要对结果进一步过滤,比如只看TB1某个时间范围的记录,或者TB2特定员工的数据,可以在JOIN后加WHERE子句:
SELECT tb1.uniqueid, tb1.datetime_entry, tb1.field_0, tb2.id_emp FROM TB1 tb1 INNER JOIN TB2 tb2 ON tb1.uniqueid = tb2.uniqueid WHERE tb1.datetime_entry >= '2018-01-30 17:33:00' -- 筛选TB1的时间范围 AND tb2.id_emp = 'emp001'; -- 筛选TB2的特定员工ID
小提示:处理重复的uniqueid
看你TB1的示例数据里,有重复的uniqueid(比如两个1517326336.62),JOIN后会生成笛卡尔积——也就是每个TB1的重复记录都会和TB2的对应记录匹配。如果想去掉重复数据,可以用DISTINCT:
SELECT DISTINCT tb1.uniqueid, tb1.datetime_entry, tb2.id_emp FROM TB1 tb1 INNER JOIN TB2 tb2 ON tb1.uniqueid = tb2.uniqueid;
或者用GROUP BY聚合数据,比如取每个uniqueid下最新的datetime_entry:
SELECT tb1.uniqueid, MAX(tb1.datetime_entry) AS latest_entry, tb2.id_emp FROM TB1 tb1 INNER JOIN TB2 tb2 ON tb1.uniqueid = tb2.uniqueid GROUP BY tb1.uniqueid, tb2.id_emp;
内容的提问来源于stack exchange,提问作者Hossam
相关产品推荐
相关产品推荐

