多表联合查询1对n的使用

本文介绍了如何使用leftjoin和子查询在SQL中查询每个学生的基本信息及与其对应的最新考勤记录。通过在考勤表上进行右连接,并结合子查询找出每个学生的最近考勤日期,确保了结果集避免了笛卡尔积,只包含一对一匹配的数据。查询条件为学生表的del_flag为0,可按需添加额外过滤条件。
摘要由CSDN通过智能技术生成

left join联合查询1:n数据时条件查询n方-使得笛卡尔积是1*1的

产生场景:

假设学生表A   考勤表B  
学生表(students)A里 每一个学生 对应了考勤表(attendances)B 里多条考勤数据(早考勤,晚考勤)

要求:查询每一个学生的基本信息和其最新的一条考勤记录信息

表字段说明:

A表:
	id    	 	学生主键id
	del_flag    删除标识
	name  
	sex
	age
B表:
	aid                   考勤表主键id
	attendance_location   考勤地点str
	attendance_time       考勤时间str
	attendance_device     考勤设备str
	sid                   考勤记录对应的学生id
	create_date           考勤时间

sql实现:

SELECT
        A.id,
        A.del_flag as delFlag,
        A.name,
        A.sex,
        A.age,
        B.attendance_location as attendanceLocation,
        B.attendance_time as attendanceTime,
        B.attendance_device as attendanceDevice
        FROM
        students A
        left join (
            select
            a.attendance_location,
            a.attendance_time,
            a.attendance_device,
            a.sid,
            a.create_date
            from attendances as a
            right join
                (select
                        max(create_date) as crdate,
                        sid
                from attendances
                group by sid) as b
                    on a.sid=b.sid
            where a.create_date=b.crdate
        ) as B
        on A.id=B.sid
        where
        A.del_flag = 0
        <if 条件 可不要>
            and xxx
        </if>
------ 此为查询 所有学生的 个人信息数据
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Oracle中,多表关联是指需要在多个表之间进行联合查询的操作。多表关联的实现方式可以分为以下三种: 1. 内连接:通过指定关联条件,将两个或多个表中满足条件的记录进行匹配,返回符合条件的结果集。内连接的语法可以使用Oracle扩展的连接方式来实现。例如,可以使用以下语法实现内连接: SELECT columns_list FROM table_name1 INNER JOIN table_name2 ON join_condition; 2. 外连接:外连接可以分为左外连接和右外连接。左外连接返回左表中所有记录以及与右表中符合条件的记录,右外连接则返回右表中所有记录以及与左表中符合条件的记录。外连接的语法和内连接类似,只是在连接条件的写法上稍有不同。 3. 自连接:自连接是指在同一个表内进行连接操作。通过给表起别名,在连接条件中使用别名来指定不同的表实例,从而实现表内的关联查询。自连接常用于需要对同一个表的不同记录进行联合查询的情况。 对于多表关联的实现,可以按照以下步骤进行操作: 1. 分析需要查询的数据来自哪些表,并构成FROM子句。 2. 分析表之间的关联关系,如果存在直接关联关系,则使用字段间的等值条件直接关联。如果不存在直接关联关系,则需要通过一个中间表进行关联,并在FROM子句中添加关联表。 3. 在WHERE子句中补充表之间的关联关系,通常n个表连接需要n-1个关联关系。根据实际情况,使用等值条件或其他逻辑条件来建立表之间的关联关系。 例如,如果需要在表A、B和E之间进行多表关联,其中A表与B表有直接关联,B表与E表也有直接关联,可以使用以下语法实现: SELECT * FROM A INNER JOIN B ON A.c1 = B.c1 INNER JOIN E ON B.c2 = E.c2;<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [【Oracle】多表联查的几种方式](https://blog.csdn.net/River_Continent/article/details/81069093)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [多表关联查询(ORACLE版)](https://blog.csdn.net/weixin_30516243/article/details/98619459)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [Oracle知识点(五)--多表连接](https://blog.csdn.net/Dou_fu/article/details/120117404)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值