关于不在内部和内部联接的帮助

时间:2011-01-27 08:20:55

标签: sql oracle

我有两张桌子。表1和表2

表1

id tid
1  100
2  200
3  300

表2

tid name
100 A
200 B

我想从表1中取出记录的id,而不是表2中的tid。

我的输出应该是这样的。

Table1.id

3

为此,我写了以下查询但是花了太多时间。以来 两个表都有更多的记录。

请帮助我如何编写查询,以便花费更少的时间。

select id from Table1 where tid not in (select tid from Table2)
select a.id from Table1 a inner join Table2 b on a.tid<>b.tid

TIA。

4 个答案:

答案 0 :(得分:8)

使用左连接,然后使用WHERE子句仅过滤连接不起作用的行:

SELECT
     a.ID
from
     Table1 a
         left join
     Table2 b
         on
            a.tid = b.tid
where
    b.tid is null

当然,这仍然可能不够快,在这种情况下你需要检查这两个表中的tid列是否有索引。

答案 1 :(得分:3)

怎么样

select id
from table1
where tid IN (
  select tid from table1
  minus
  select tid from table2 
)

在Oracle中设置操作(减去上面部分)非常快

答案 2 :(得分:1)

首先创建索引:

CREATE INDEX t1_tid ON table1 (tid ASC);
CREATE INDEX t2_tid ON table2 (tid ASC);

这样可能会更快。

关于查询,如何:

SELECT tid FROM table1
MINUS
SELECT tid FROM table2

答案 3 :(得分:0)

您也可以尝试“不存在”:

从Table1 T1中选择*不存在 (从表2 T2中选择1,其中T1.tid = t2.tid);