由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Database版 - 请教一个Union后结果显示顺序的问题
相关主题
请问如何实现这样一个db2的query, 谢谢A sql question
这2个query哪个快点,为啥how to make query faster?
关于Acess的简单问题query estimation shows cost 900%?
一个SQL query的问题oracle JDBC thin vs. JDBC OCI
Question 2: distributed database question?再问个excel问题吧
[转载] question about SQL in Access急,SQL2005, 怎么查过去一小时里run过的所有query?
[转载] Can anyone interpret this simple SQL?Late afternoon 腦不好使
请教一个query请教一个mssql的问题
相关话题的讨论汇总
话题: name话题: line1话题: address话题: st话题: tom
进入Database版参与讨论
1 (共1页)
s********e
发帖数: 893
1
比如这样一个query
select first_name, last_name, Address_line1
from HRData
where first_name ='Tom' and last_name ='Cruise'
union
select first_name, last_name, Address_line1
from HRData
where address_line1 like '1234 Cherry St.';
结果显示可以是:
Tom Cruise 4321 Blueberry St.
Tom Cruise 1234 Cherry St.
John Smith 1234 Cherry St.
也可以是:
John Smith 1234 Cherry St.
Tom Cruise 4321 Blueberry St.
Tom Cruise 1234 Cherry St.
因为不能保证第一个query的结果就一定排在第二个query的结果的前面。
所以如果我想让第一个query的结果一定排在第二个的前面,我给每个query加了个
display order:
select disp_order, first_name, last_name, Address_line1
from
(
select 1 disp_order, first_name, last_name, Address_line1
from HRData
where first_name ='Tom' and last_name ='Cruise'
union
select 2, first_name, last_name, Address_line1
from HRData
where address_line1 like '1234 Cherry St.'
)
order by disp_order, last_name;
这样结果就变成了:
1 Tom Cruise 4321 Blueberry St.
2 Tom Cruise 1234 Cherry St.
3 Tom Cruise 1234 Cherry St.
4 John Smith 1234 Cherry St.
其中 Tom Cruise 1234 Cherry St.满足两个query,所以出现了两次。现在我想让这种
duplicate的record只出现一次,而且必须让第一个query的结果出现在第二个query的
前面,该怎么做? 因为加了个disp_order,所以没法用distinct。感觉应该不难,可
是就是不知道怎么写。多谢了先!
r*****y
发帖数: 264
2
Try:
select disp_order, first_name, last_name, Address_line1
from
(
select 1 disp_order, first_name, last_name, Address_line1
from HRData
where first_name ='Tom' and last_name ='Cruise'
union
select 2, first_name, last_name, Address_line1
from HRData
where address_line1 like '1234 Cherry St.'
minus
select 2 disp_order, first_name, last_name, Address_line1
from HRData
where first_name ='Tom' and last_name ='Cruise'
)
order by disp_order, last_name;
s********e
发帖数: 893
3
Minus固然可以去除重复的,但是实际上有6个query Union在一起,而每个query都有可
能产生重复,但是又希望结果按这6个query的顺序在现实。
没有用过partition, 准备研究一下看看可行不可行。谢谢!
s********e
发帖数: 893
4
如果加个distinct,去掉外面的disp_order
select distinct first_name, last_name, Address_line1
from
(
select 1 disp_order, first_name, last_name, Address_line1
from HRData
where first_name ='Tom' and last_name ='Cruise'
union
select 2, first_name, last_name, Address_line1
from HRData
where address_line1 like '1234 Cherry St.'
)
order by disp_order, last_name;
结果是不是就一定是下面这个顺序呢?还是第二个query的结果有可能排在第一个的前
面?
Tom Cruise 4321 Blueberry St.
Tom Cruise 1234 Cherry St.
John Smith 1234 Cherry St.
实验了一下,这个结果的显示顺序还是随机的,不是按照期待的顺序。
y****w
发帖数: 3747
5
again, partition by

【在 s********e 的大作中提到】
: 如果加个distinct,去掉外面的disp_order
: select distinct first_name, last_name, Address_line1
: from
: (
: select 1 disp_order, first_name, last_name, Address_line1
: from HRData
: where first_name ='Tom' and last_name ='Cruise'
: union
: select 2, first_name, last_name, Address_line1
: from HRData

B*****g
发帖数: 34098
6
address_line1 like '1234 Cherry St.' ????

【在 s********e 的大作中提到】
: 比如这样一个query
: select first_name, last_name, Address_line1
: from HRData
: where first_name ='Tom' and last_name ='Cruise'
: union
: select first_name, last_name, Address_line1
: from HRData
: where address_line1 like '1234 Cherry St.';
: 结果显示可以是:
: Tom Cruise 4321 Blueberry St.

s********e
发帖数: 893
7
typo.
address_line1 ='1234 Cherry St.'
b*****o
发帖数: 284
8
union ALL
B*****g
发帖数: 34098
9
假设table本身没有dup:
select first_name, last_name, Address_line1
from HRData
where first_name ='Tom' and last_name ='Cruise'
union ALL
select first_name, last_name, Address_line1
from HRData
where address_line1 = '1234 Cherry St.'
AND (first_name <> 'Tom' OR last_name <> 'Cruise') --需要handle null

【在 s********e 的大作中提到】
: typo.
: address_line1 ='1234 Cherry St.'

s********e
发帖数: 893
10
理解Beijing MM的思路,就是后面的query要加上条件去掉和第一个query会产生同样结
果的records。这个方法和minus一样如果只有两个query是可行的。但是现在是多个
query union在一起,就很难每一个后面的query都去排除前面的query了。
之所以产生这样一个问题,是因为在搜索时每个query产生结果的概率不一样。想把概
率最大的query的结果排在最前面,概率小的query的结果排在后面,但是两个query的
结果有可能重复。所以强制性的给每个query加了个Disp_Order。但是它的加入,导致
了两个同样的records因为这个field的不同而不同了,所以无法用distinct。
不知道说清楚了没有。问过办公室里的oracle大牛,说这个问题困扰他多年。
partition by 应该可以解决这个问题
rank()
over (partition by disp_order order by XXXX)my_rank
但是不知道这个order by后面应该是什么。
相关主题
[转载] question about SQL in AccessA sql question
[转载] Can anyone interpret this simple SQL?how to make query faster?
请教一个queryquery estimation shows cost 900%?
进入Database版参与讨论
B*****g
发帖数: 34098
11
6个并不多,效率会好很多

【在 s********e 的大作中提到】
: 理解Beijing MM的思路,就是后面的query要加上条件去掉和第一个query会产生同样结
: 果的records。这个方法和minus一样如果只有两个query是可行的。但是现在是多个
: query union在一起,就很难每一个后面的query都去排除前面的query了。
: 之所以产生这样一个问题,是因为在搜索时每个query产生结果的概率不一样。想把概
: 率最大的query的结果排在最前面,概率小的query的结果排在后面,但是两个query的
: 结果有可能重复。所以强制性的给每个query加了个Disp_Order。但是它的加入,导致
: 了两个同样的records因为这个field的不同而不同了,所以无法用distinct。
: 不知道说清楚了没有。问过办公室里的oracle大牛,说这个问题困扰他多年。
: partition by 应该可以解决这个问题
: rank()

B*****g
发帖数: 34098
12
你这算是剽窃

【在 y****w 的大作中提到】
: again, partition by
y****w
发帖数: 3747
13
靠,

【在 B*****g 的大作中提到】
: 你这算是剽窃
y****w
发帖数: 3747
14
try order by 1

【在 s********e 的大作中提到】
: 理解Beijing MM的思路,就是后面的query要加上条件去掉和第一个query会产生同样结
: 果的records。这个方法和minus一样如果只有两个query是可行的。但是现在是多个
: query union在一起,就很难每一个后面的query都去排除前面的query了。
: 之所以产生这样一个问题,是因为在搜索时每个query产生结果的概率不一样。想把概
: 率最大的query的结果排在最前面,概率小的query的结果排在后面,但是两个query的
: 结果有可能重复。所以强制性的给每个query加了个Disp_Order。但是它的加入,导致
: 了两个同样的records因为这个field的不同而不同了,所以无法用distinct。
: 不知道说清楚了没有。问过办公室里的oracle大牛,说这个问题困扰他多年。
: partition by 应该可以解决这个问题
: rank()

B*****g
发帖数: 34098
15
lz办公室里的oracle大牛都解决不了,lz够戗呀

【在 y****w 的大作中提到】
: try order by 1
s********e
发帖数: 893
16
所以请教版上的大牛了。呵呵。
改成这个样子了,还是不行。感觉用partition by就差一点点了。
select distinct first_name, last_name, Address_line1 rank()
over (partition by disp_order order by 1) my_rank
from
(
select 1 disp_order, first_name, last_name, Address_line1
from HRData
where first_name ='Tom' and last_name ='Cruise'
union
select 2, first_name, last_name, Address_line1
from HRData
where address_line1 like '1234 Cherry St.'
)
order by my_rank;
B*****g
发帖数: 34098
17
我觉得partition by要order 2次。下班了,请yhwang继续点评
WITH t AS (
select 1 disp_order, first_name, last_name, Address_line1
from HRData
where first_name ='Tom' and last_name ='Cruise'
union ALL
select 2, first_name, last_name, Address_line1
from HRData
where address_line1 = '1234 Cherry St.'),
t1 AS (
select disp_order, first_name, last_name, Address_line1, row_number() over (
partition BY first_name, last_name, Address_line1 order by disp_order) rn
FROM t)
select first_name, last_name, Address_line1
from t1
where rn = 1
order by disp_order

【在 s********e 的大作中提到】
: 所以请教版上的大牛了。呵呵。
: 改成这个样子了,还是不行。感觉用partition by就差一点点了。
: select distinct first_name, last_name, Address_line1 rank()
: over (partition by disp_order order by 1) my_rank
: from
: (
: select 1 disp_order, first_name, last_name, Address_line1
: from HRData
: where first_name ='Tom' and last_name ='Cruise'
: union

y****w
发帖数: 3747
18
这两天腰缠龙痛苦不堪中,熬到下班点早就跑了。
partition by的,distinct MIN(disp_order)over(partition... order by disp_
order)应该简单些,少一层,不过似乎很晦涩。也没准是错的。
不用partition by,大致可以这样,
WITH t AS (
select 1 disp_order, first_name, last_name, Address_line1
from HRData
where first_name ='Tom' and last_name ='Cruise'
union ALL
select 2, first_name, last_name, Address_line1
from HRData
where address_line1 = '1234 Cherry St.'
)
select disp_order, first_name, last_name, Address_line1
from t t1
where
t1.disp_order = (
select min(disp_order) from t t2
where (t2.first_name, t2.last_name, t2.Address_line1) = (t1.first_name,
t1.last_name, t1.Address_line1)
)
;

【在 B*****g 的大作中提到】
: 我觉得partition by要order 2次。下班了,请yhwang继续点评
: WITH t AS (
: select 1 disp_order, first_name, last_name, Address_line1
: from HRData
: where first_name ='Tom' and last_name ='Cruise'
: union ALL
: select 2, first_name, last_name, Address_line1
: from HRData
: where address_line1 = '1234 Cherry St.'),
: t1 AS (

s********e
发帖数: 893
19
两位大牛实在厉害!两种方法都测试过了,都对!用min(disp_order)比较直观易懂,
用partition by三层query层层递进,结构清晰,而且union 的query越多,fields越多
,越显示partition by的优越性,因为不需要像min(disp_order)那样要把所有其它
fields都比较一遍。一个小例子展示了两位扎实的sql功底!完胜我们办公室16年经验
的Oracle大牛。上周问的where里用case,也是办公室大牛不知道,最后两位解答的。
一周学习一个高级sql。多谢多谢,周末愉快!
B*****g
发帖数: 34098
20
tk说:要保证order,就得用order by
似乎按他说的其他都不能保证order:自求多福,oracle will not guaranty

【在 y****w 的大作中提到】
: 这两天腰缠龙痛苦不堪中,熬到下班点早就跑了。
: partition by的,distinct MIN(disp_order)over(partition... order by disp_
: order)应该简单些,少一层,不过似乎很晦涩。也没准是错的。
: 不用partition by,大致可以这样,
: WITH t AS (
: select 1 disp_order, first_name, last_name, Address_line1
: from HRData
: where first_name ='Tom' and last_name ='Cruise'
: union ALL
: select 2, first_name, last_name, Address_line1

相关主题
oracle JDBC thin vs. JDBC OCILate afternoon 腦不好使
再问个excel问题吧请教一个mssql的问题
急,SQL2005, 怎么查过去一小时里run过的所有query?parameterized queries with no inputs
进入Database版参与讨论
B*****g
发帖数: 34098
21
你那的大牛挣多少钱

【在 s********e 的大作中提到】
: 两位大牛实在厉害!两种方法都测试过了,都对!用min(disp_order)比较直观易懂,
: 用partition by三层query层层递进,结构清晰,而且union 的query越多,fields越多
: ,越显示partition by的优越性,因为不需要像min(disp_order)那样要把所有其它
: fields都比较一遍。一个小例子展示了两位扎实的sql功底!完胜我们办公室16年经验
: 的Oracle大牛。上周问的where里用case,也是办公室大牛不知道,最后两位解答的。
: 一周学习一个高级sql。多谢多谢,周末愉快!

s********e
发帖数: 893
22
我们在大学,大牛都不到10万。去年学校好几个工作10年以上的DBA同时辞职了,随后
新招的DBA就都是10万以上了。
请问TK是?
B*****g
发帖数: 34098
23
tom kyte

【在 s********e 的大作中提到】
: 我们在大学,大牛都不到10万。去年学校好几个工作10年以上的DBA同时辞职了,随后
: 新招的DBA就都是10万以上了。
: 请问TK是?

y****w
发帖数: 3747
24
表示非常羡慕嫉妒,赫赫.

【在 s********e 的大作中提到】
: 我们在大学,大牛都不到10万。去年学校好几个工作10年以上的DBA同时辞职了,随后
: 新招的DBA就都是10万以上了。
: 请问TK是?

1 (共1页)
进入Database版参与讨论
相关主题
请教一个mssql的问题Question 2: distributed database question?
parameterized queries with no inputs[转载] question about SQL in Access
Re: Recordset - I stuck! Help![转载] Can anyone interpret this simple SQL?
A SQL query never stop running is bothering me: help needed (转载)请教一个query
请问如何实现这样一个db2的query, 谢谢A sql question
这2个query哪个快点,为啥how to make query faster?
关于Acess的简单问题query estimation shows cost 900%?
一个SQL query的问题oracle JDBC thin vs. JDBC OCI
相关话题的讨论汇总
话题: name话题: line1话题: address话题: st话题: tom