sql 不同表的排序

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql 不同表的排序相关的知识,希望对你有一定的参考价值。

假如我用两个表
一个是A表,A表里有字段1
一个是B表,B表里有字段2
sql="select * from b"
我写了这个样一个Sql 句子,但我想以A表里的字段1做为B表的sql句子的排序,要怎么写?

一、SQL语句排序的字段必须出现在SELECT后面的选择列表里面,要让结果以A.字段1排序,就必须选择出它,SQL的前面部分就是:SELECT b.*, a.字段1

二、要在选择B表数据的同时选择A表的某些字段,这两个表必须有一定的关系,然后把他们连接起来,那么SQL的FROM部分是:FROM B INNER JOIN A ON A.关键字段=B.关键字段

举例:
A表字段有:学号、姓名、性别、住址、电话
B表字段有:学号、语文、数学

现在要显示B表的总成绩,但排序要求是按姓名,不是成绩和学号,那么SQL如下:

SELECT B.学号, B.语文+B.数学, A.姓名 FROM B INNER JOIN A ON A.学号=B.学号
参考技术A 如果是涉及2个表的,你在a表和b表中应该是有一个字段可以关联的,这里假设叫字段x,你可以这样写

select b.字段1,b.字段2.... from b,a where b.字段x=a.字段x order by a.字段1

如何在没有临时表的 SQL 查询中为组添加序列号

【中文标题】如何在没有临时表的 SQL 查询中为组添加序列号【英文标题】:How to add sequence number for groups in a SQL query without temp tables 【发布时间】:2011-03-09 22:55:39 【问题描述】:

我在 SQL 2008 中创建了一个复杂的搜索查询,它返回按组排序的数据,并且查询本身具有分页和排序功能,但不是根据分页选项返回一组记录,它需要返回一组组(因此记录数会有所不同)。

我目前正在通过使用临时表来执行此操作(第一个临时表创建一个将被选为搜索的一部分的组列表,然后对它们进行编号......第二个查询加入此表到实际搜索...所以,它最终运行搜索查询两次)。

我正在寻找一种更有效的方法来使用 SQL 2008 中的一些新函数(不需要使用临时表)。

如果我能以这样的格式获取数据,我会被设置...

记录组 GroupSequence --------|----------|-------------- 1 鸡 1 2 鸡 1 3 奶牛 2 4 马 3 5 马 3 6 马 3

关于如何在 SQL 2008 中使用单个查询而不使用临时表来完成此任务的任何想法?

【问题讨论】:

哪些列来自数据,哪些需要计算值? 第一列和第二列(“Record[Number]”和“Group”)来自数据。 “GroupSequence”列将由查询计算。 【参考方案1】:

样本数据

create table sometable([group] varchar(10), id int, somedata int)
insert sometable select 'Horses', 9, 11
insert sometable select 'chickens', 19, 121
insert sometable select 'Horses', 29, 123
insert sometable select 'chickens', 49, 124
insert sometable select 'Cows', 98, 1
insert sometable select 'Horses', 99, 2

查询

select
    Record = ROW_NUMBER() over (order by [Group], id),
    [Group],
    GroupSequence = DENSE_RANK() over (order by [Group])
from sometable

输出

Record               Group      GroupSequence
-------------------- ---------- --------------------
1                    chickens   1
2                    chickens   1
3                    Cows       2
4                    Horses     3
5                    Horses     3
6                    Horses     3

【讨论】:

漂亮! DENSE_RANK() 正是我想要的,而且似乎比我使用的临时表更有效。 正是文档为我订购的内容 - DENSE_RANK() 如果组中只有一个字段,这可以工作。但是如果多个字段定义一个组呢?【参考方案2】:

如果没有关于您拥有的表的更多详细信息,我会说查看CTE 查询和row_number 函数......类似于以下内容:

;with groups as (
  select top 10 name, row_number() over(order by name) 'sequence'
  from table1
  group by name
  order by name
)
select row_number() over(order by g.name) 'Record',
  g.name 'GroupName',
  g.sequence 'GroupSequence'
from groups

【讨论】:

出于分页的目的,我修改了大部分搜索查询以使用这种新的“with as”表示法,它的运行速度似乎比 @ 或 # 临时表快得多. 小心,因为这并不总是正确的。 with 查询符号,在这种用法中,就像一个命名子查询(可以多次使用)......所以有时,临时表或表变量会是更好的选择。

以上是关于sql 不同表的排序的主要内容,如果未能解决你的问题,请参考以下文章

SQL怎样合并显示两个没有关联的表

SQL Server 2005 排序规则问题

如何对比两个相同数据库表的不同

SQL:来自具有不同日期格式的不同表的聚合

根据来自两个不同表的字段对行进行排序

用于关联不同 SQL Server 表的选项 [重复]