m*********a 发帖数: 3299 | 1 table 1
id value
1 1
1 2
1 3
2 4
table 2
id value
1 1
1 4
1 2
1 4
2 4
选出1 4 |
s**********o 发帖数: 14359 | 2 WHERE NOT EXISTS是比较好的
当然 NOT IN (SELECT)也行,但是很不EFFICIENT |
m*********a 发帖数: 3299 | 3 select t1.id, t1.value
from table1 t1
where To_char(t1.id)||'_'||t1.value
not in
(
select To_char(t2.id)||'_'||t2.value
from table2 t2
)
【在 s**********o 的大作中提到】 : WHERE NOT EXISTS是比较好的 : 当然 NOT IN (SELECT)也行,但是很不EFFICIENT
|
m*********a 发帖数: 3299 | |
l******n 发帖数: 9344 | 5 outer join 再filter
【在 m*********a 的大作中提到】 : table 1 : id value : 1 1 : 1 2 : 1 3 : 2 4 : table 2 : id value : 1 1 : 1 4
|
a******g 发帖数: 725 | 6 我靠,新手?我老这种不玩SQL的也知道用except 或 table join |
m*********a 发帖数: 3299 | 7 是比较新,不然就不会问了,我去看看except是啥
select t1.id, t1.value
from table1 t1
where not exists(
select t2.id,t2.value
from table 2 t2
where t1.id=t2.id and t2.value=t2.value
)
【在 a******g 的大作中提到】 : 我靠,新手?我老这种不玩SQL的也知道用except 或 table join
|
m*********a 发帖数: 3299 | 8 我看not exist的效率不行,每个row 都要去做not exist的subquery?
【在 s**********o 的大作中提到】 : WHERE NOT EXISTS是比较好的 : 当然 NOT IN (SELECT)也行,但是很不EFFICIENT
|
s**********o 发帖数: 14359 | 9 When using “NOT IN”, the query performs nested full table scans, whereas
for “NOT EXISTS”, query can use an index within the sub-query.
你那个To_char(t2.id)||'_'||t2.value每行都要构造一个新VALUE还没有INDEX
非常差的PERFORMANCE,如果值表一是1.0,表2是1.00,你的NOT IN都不WORK的
【在 m*********a 的大作中提到】 : 我看not exist的效率不行,每个row 都要去做not exist的subquery?
|
m*********a 发帖数: 3299 | 10 这个concat是有问题,我现在用not exists。
估计都是N*M的复杂度,速度差不多
我现在想的outer join是咋写的
【在 s**********o 的大作中提到】 : When using “NOT IN”, the query performs nested full table scans, whereas : for “NOT EXISTS”, query can use an index within the sub-query. : 你那个To_char(t2.id)||'_'||t2.value每行都要构造一个新VALUE还没有INDEX : 非常差的PERFORMANCE,如果值表一是1.0,表2是1.00,你的NOT IN都不WORK的
|
|
|
B*****g 发帖数: 34098 | 11 用sql server的就是悲哀,我教10几年前就解决了这个问题,NOT EXISTS使劲用
【在 s**********o 的大作中提到】 : When using “NOT IN”, the query performs nested full table scans, whereas : for “NOT EXISTS”, query can use an index within the sub-query. : 你那个To_char(t2.id)||'_'||t2.value每行都要构造一个新VALUE还没有INDEX : 非常差的PERFORMANCE,如果值表一是1.0,表2是1.00,你的NOT IN都不WORK的
|
s**********o 发帖数: 14359 | 12 except/minus容易出错的,比如VALUE是NULL的时候就给弄没了 |
m******u 发帖数: 12400 | 13 你这是说的什么意思啊?SQL server也有exists|no exists用法的呀。
发信人: Beijing (我是猪,听说猪是被祝福的), 信区: Database
标 题: Re: 咋样选一个表中在另一个表中不含有的记录
发信站: BBS 未名空间站 (Wed Jul 1 16:05:03 2015, 美东)
用sql server的就是悲哀,我教10几年前就解决了这个问题,NOT EXISTS使劲用 |
m******u 发帖数: 12400 | 14 这是经典面试题啊:找出从来没买过东西的顾客,找出从没卖出过东西的营销员。etc
很有用的,现在定型的query是怎样的?那位大牛可以贴一个上来吗?谢谢! |
n***l 发帖数: 143 | 15 How about this one?
SELECT t2.id, t2.value
FROM t2 LEFT JOIN t1
ON t1.id=t2.id AND t1.value=t2.value
WHERE t1.id IS NULL |
s**********o 发帖数: 14359 | 16 你假设了T2里有的T1里肯定有,万一T1, T2根本就JOIN不上呢
比如
T1:
2,1
T2:
1,2
【在 n***l 的大作中提到】 : How about this one? : SELECT t2.id, t2.value : FROM t2 LEFT JOIN t1 : ON t1.id=t2.id AND t1.value=t2.value : WHERE t1.id IS NULL
|
m******u 发帖数: 12400 | 17 smallburrito不要指出问题不给解决方法吧。你指出的这个问题的确非常重要,我想知
道该怎么办。 |
m*********a 发帖数: 3299 | 18 这个left join不是可以选出t2 1,2么,
我在mysql试了一下是对的
【在 s**********o 的大作中提到】 : 你假设了T2里有的T1里肯定有,万一T1, T2根本就JOIN不上呢 : 比如 : T1: : 2,1 : T2: : 1,2
|
n****f 发帖数: 3580 | 19 In Oracel, this is working:
select t2.*
from t1 , t2
where t2.id=t1.id(+)
and t2.val=t1.val(+)
and t1.id is null
【在 m*********a 的大作中提到】 : table 1 : id value : 1 1 : 1 2 : 1 3 : 2 4 : table 2 : id value : 1 1 : 1 4
|
m*****y 发帖数: 229 | 20 sql server 的话,这个应该work。
select t2.*
from table2 t2
where not exists (select 1 from table1 t1 where t1.id=t2.id and t1.value=t2.
value) |