合并 Select 语句并动态排序?
Posted
技术标签:
【中文标题】合并 Select 语句并动态排序?【英文标题】:Merge Select statement and order dynamically? 【发布时间】:2010-10-16 12:10:47 【问题描述】:-
我有一个 select 语句,它将返回 5 个值,分别为 val1、val3、val5、val2、val4
我有另一个 select 语句,它将返回一组记录,其中一个列的值来自上述集合(val1 到 val5)
是否可以用第一个 select 语句的结果对第二个 select 语句进行排序?
我的意思是按 val1,val3,val5,val2,val4 的顺序。
这意味着如果第一个语句颠倒顺序,我必须颠倒顺序。
如果可以,请告诉我。
【问题讨论】:
您能否发布一个脚本来说明如何创建您正在使用的表(可以是示例版本)以及每个表的示例选择语句?这样你会得到更好的答案。 【参考方案1】:你还没有发布你的实际查询,所以我可能会假设它们比它们更简单,但如果你的第一个语句是:
select val from valuetable order by someothercolumn
那么您的第二个查询可能是
select table2.name, table2.phonenumber, table2.creationdate, table2.val
from table2
left join valuetable on table2.val = valuetable.val
order by valuetable.someothercolumn
换句话说,您可以将第一个语句的顺序复制到第二个。
【讨论】:
【参考方案2】:我不确定我是否理解你的问题,但我会试一试。
用行号增加第一个查询(IIRC,MsSQL server 2005 有一个 ROW_NUMBER() 函数) 加入 val#,并按关联的行号排序 从结果中去除行号【讨论】:
【参考方案3】:大概,第一个语句有一些顺序(如果没有,“val”的顺序将是任意的,你不会关心它们。
所以,取第二个语句(返回数据),并在 vals 上离开第一个语句(返回有序的“val”),并按照第一个语句的顺序排序。
【讨论】:
【参考方案4】:我不确定我是否完全理解这个问题,但试试这个。我假设您的表格看起来像这样?
Table1:
myfield1
val1
val2
val2
Table2:
myField2 myDataField
val1 test1
val2 test2
val3 test3
那么你的 sql 语句应该是这样的
SELECT myDataField
FROM Table2 INNER JOIN Table1 ON Table2.myField2=Table1.myField1
ORDER BY Table1.myField1
HTH
【讨论】:
【参考方案5】: 简单的回答:是的...但是你必须使用二级排序 列和嵌套的内部选择。
表一 值列 +------+ | val1 | +------+ | val3 | +------+ | val5 | +------+ | val2 | +------+ | val4 | +------+
选择SetOne 排名 ValColumn +--------+----------+ | 1 | val1 | +--------+----------+ | 2 | val3 | +--------+----------+ | 3 | val5 | +--------+----------+ | 4 | val2 | +--------+----------+ | 5 | val4 | +--------+----------+
表二 ValColumn Col +------------+------+ |值 | .... | +-----------+------+
最终选择 排名 ValColumn Col +--------+------------+------+ | 1 | val1 | .... | +--------+------------+------+ | 1 | .... | .... | +--------+------------+------+ | 1 | val1 | .... | +--------+------------+------+ | 2 | val3 | .... | +--------+------------+------+ | 2 | .... | .... | +--------+------------+------+ | 2 | val3 | .... | +--------+------------+------+ | 3 | val5 | .... | +--------+------------+------+ | 3 | .... | .... | +--------+------------+------+ | 3 | val5 | .... | +--------+------------+------+ | 4 | val2 | .... | +--------+------------+------+ | 4 | .... | .... | +--------+------------+------+ | 4 | val2 | .... | +--------+------------+------+ | 5 | val4 | .... | +--------+------------+------+ | 5 | .... | .... | +--------+------------+------+ | 5 | val4 | .... | +--------+------------+------+
这里是选择语句:
选择 SelectSetOne.rank, TableTwo.ValColumn, 表二。* 从 (选择 排名=计数(*), 值列 FROM TableOne) 作为 SelectSetOne, 内部联接 表二 ON SelectSetOne.ValColumn = TableTwo.ValColumn 订购方式 SelectSetOne.rank;
【讨论】:
以上是关于合并 Select 语句并动态排序?的主要内容,如果未能解决你的问题,请参考以下文章
将多个 CASE 语句合并为一个并 SELECT INTO 临时表