有个业务场景,主表中一条数据,在子表中有多条详情数据。对数据进行展示的时候,产品希望随意拿一条子表的数据关联展示出来,用了很多方案,但是都不够好。

sql查询取子表任意一条,多个字段的方案

最终找到一个高效的方案记录如下:

需求如图:

最早的第一套方案:

select distinct
A.ID,
A.Title,
A.[Description],
A.xx1,
A.xx2,
A.xx3, B.ID as BId,
B.xxA,
B.xxB,
B.xxC,
B.xxD
from A
left join B on A.ID=B.CgId

  该方案一般情况下没有问题,但是如果B表的字段值不一样,就会出现结果仍然重复问题。

第二种方案:

用了分组和聚合函数 max ,min这种

但是个人感觉太有局限性,不是太对,就不粘贴代码了。

第三种方案:

用了很多top 1

select
A.ID,
A.Title,
A.[Description],
A.xx1,
A.xx2,
A.xx3, (select top 1 B.ID from B where A.ID=b.CgId) as BId,
(select top 1 B.xxA from B where A.ID=b.CgId) as xxA,
(select top 1 B.xxB from B where A.ID=b.CgId) as xxB,
(select top 1 B.xxC from B where A.ID=b.CgId) as xxC,
(select top 1 B.xxD from B where A.ID=b.CgId) as xxD
from A
left join B on A.ID=B.CgId

由于需要子表的字段太多,这种方法一看效率就比较低,但是是不是真的特别低没做测试。

第四种方案,是我认为看着效率就比较高的方案:

select * from
(
select
a.*,
(select top 1 Id from B as b where b.CgId =a.ID)as bid
from A as a
)
as temp
left join B as b2 on temp.bid=b2.Id

这种方法首先将主表与子表数据其中一条的Id联系起来作为一个“中间表”,然后后“中间表”与子表连接。

个人推荐这种方案,效率您可以坐下测试。

该方案是有群里面一个大神提供的。

sql主表分页查询关联子表取任意一条高效方案的更多相关文章

  1. SQL 数据分页查询

    最近学习了一下SQL的分页查询,总结了以下几种方法. 首先建立了一个表,随意插入的一些测试数据,表结构和数据如下图: 现在假设我们要做的是每页5条数据,而现在我们要取第三页的数据.(数据太少,就每页5 ...

  2. Oracle/MySql/SQL Sqlserver分页查询

    简述 简单概括一下Oracle,MySql,SQL Sqlserver这三个数据库的分页查询语句. Oracle分页查询 例:每页显示两条数据,现在要查询第二页,也就是第3-4条数据. 查询语句: s ...

  3. [.NET] SQL数据分页查询

    [.NET] SQL数据分页查询 程序下载 范例下载:点此下载 原始码下载:点此下载 NuGet封装:点此下载 数据查询 开发系统时,使用C#执行SQL查询指令,就可以从SQL数据库里查询所需数据. ...

  4. SQL Server 2008 查询所有用户表

    SQL Server 2008 查询所有用户表的T-SQL语句是: SELECT * FROM sysobjects WHERE [xtype] = 'U' 或者是: SELECT * FROM sy ...

  5. Hibernate使用原生SQL语句进行无关联多表查询

    背景:有两个表:CpCg与CpGg需要进行多表查询 因为CpGg表设计到与另外的表也有联系,因此师兄没有关联此两个表,只是用字段进行逻辑关联,CpGg表的cp字段与CpCg表的id字段逻辑关联

  6. 【mybatis】mybatis查询 结果 用map接收,无实体接收 + 关联子表 一并返回主子表的结果

    如果后台程序没有实体对应mysql的数据表. 而mybatis想要查询mysql这个数据表的数据,返回给应用程序. 应用程序该如何接收? =============================== ...

  7. Entity Framework 使用sql语句分页(查询单表)

    1.查询单表 var pageSize = 2;//条数 var pageIndex = 2;//索引 var sql = @" SELECT D.* FROM ( SELECT ROW_N ...

  8. Oracle中分页查询和联表查询

    1.使用ROWNUM伪列查询 1.1.查询十条数据(rownum<=n) SELECT ROWNUM,A.* FROM v_sjjx_unit_info A WHERE ROWNUM<=1 ...

  9. sql server分页查询

    1.引言 在列表查询时由于数据量非常多,一次性查出来会非常慢,就算一次查出来了,也不能一次性显示给客户端,所以要把数据进行分批查询出来,每页显示一定量的数据,这就是数据要分页. 2.常用的数据分页方法 ...

随机推荐

  1. 了解MapReduce_2

    再写MapReduce执行流程之前,首先先对MapReduce有一些了解: 1. 简介 MapReduce是一个计算框架,既然是做计算的框架,那么表现的形式上就有输入,操作输入,得到结果2.主从结构 ...

  2. rails + MySQL 存储emoji表情 😯

    database.yml 加入 charset: utf8mb4 encoding: utf8mb4 collation: utf8mb4_unicode_ci 创建migration ,更改要存放表 ...

  3. [Golang学习笔记] 08 链表

    链表(Linked list)是一种常见数据结构,但并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针. 由于不必须按顺序存储,链表在插入的时候可以达到O(1),比顺序表快得多,但是查 ...

  4. 鼠标移动在屏幕上显示温度Tip提示功能-CToolTipCtrl类的使用

    初学VC++,太多知识不懂,需要不断的查找资料,想通过记录让自己有所积累,主要是怕以后会很快忘记.最近在做一个在屏幕上显示鼠标移动位置的温度值,我利用先缓存一帧图像的温度值,然后,通过鼠标移动消息相应 ...

  5. 安装虚拟机与初触linux心得

    安装虚拟机与初触linux心得 安装虚拟机 不知道是电脑问题还是软件问题,我安装虚拟机的过程异常坎坷,首先我在官网,360,太平洋等地方下载的virtualbox5.0以后的软件普遍有问题,问题是打不 ...

  6. 20155239 2016-2017-2 《Java程序设计》第10周学习总(2017-04-22 16:26

    教材学习 1.基本概念划分 OIS的七层协议: 应用层.表示层.会话层.运输层.网络层.数据链路层.物理层. OIS的五层协议: 应用层.运输层.网络层.数据链路层.物理层. 由下往上介绍如下: 2. ...

  7. Linux Shell中的特殊符号和含义简明总结(包含了绝大部份)

    case语句适用于需要进行多重分支的应用情况. case分支语句的格式如下: case $变量名 in 模式1) 命令序列1 ;; 模式2) 命令序列2        ;; *) 默认执行的命令序列  ...

  8. Kali linux 安装

    df -m umount  /media exit

  9. 【转】odoo学习之:API整合文档

    Odoo8.0新API文档 一.新API概述 在8中,api接口分为traditaional style和record style,traditional style指的就是我们在7中使用的类型,de ...

  10. 可能是全网首个支持阿里云Elasticsearch Xapck鉴权的Skywalking

    可能是全网首个支持阿里云Elasticsearch Xapck鉴权的Skywalking 对Skywalking有兴趣的同学参见:年轻人的第一个APM-Skywalking 之前在搭建Skywalki ...