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 | | 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后面应该是什么。 | | | 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
| | | 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是?
|
|