【SQL】一條外連線和內連線混合使用的SQL語句搞定同事一迷茫需求

secooler發表於2009-02-20
今天一個同事問到一個SQL語句的寫法,整理到這裡。
為完成這個需求用到了外連線和內連線,對sql的連線語句的理解比較有幫助。

SQL> create table b (id number,file varchar2(10));
SQL> create table b (id number,f varchar2(10));
SQL> insert into a values (1,1,2);
SQL> insert into a values (2,3,'');
SQL> insert into a values (3,4,3);
SQL> commit;
SQL> insert into b values (1,'A:\>');
SQL> insert into b values (2,'B:\>');
SQL> insert into b values (3,'C:\>');
SQL> insert into b values (4,'D:\>');
SQL> commit;
SQL> select * from a;

        C1         C2         C3
---------- ---------- ----------
         1          1          2
         2          3
         3          4          3

SQL> select * from b;

        ID F
---------- ----------
         1 a
         2 b
         3 c
         4 d

透過上面的過程構建出下面的兩張表:
a表:
c1 c2 c3
1  1  2
2  3
3  4  3

b表:
id f
1  A:\>
2  B:\>
3  C:\>
4  D:\>

表含義介紹:
a表:c1列表示序號,c2列表示檔案號,c3列表示與c2列相關聯的檔案號
b表:id列表示檔案號,f列表示檔案所在的磁碟位置

需求:取得每個檔案所在的位置和對應檔案位置的列表,如果對應檔案位置不存在需要顯示為空。

處理思路:
1.透過外連線使b表中id值與a表中c2值相等構造出temp1表
SQL> select b.id,b.f,a.c3 from a,b where a.c2(+)=b.id;
2.temp1與自身進行自連線得到關聯檔案對應的磁碟位置
SQL> select temp1.id,temp1.f,b.f from temp1, b where temp1.c3=b.id(+) order by 1;

最終,一條SQL語句搞定需求:
SQL> select temp1.id,temp1.f,b.f from (select b.id,b.f,a.c3 from a,b where a.c2(+)=b.id) temp1, b where temp1.c3=b.id(+) order by 1;

        ID F          F
---------- ---------- ----------
         1 A:\>       B:\>
         2 B:\>
         3 C:\>
         4 D:\>       C:\>

-- The End --

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/519536/viewspace-557229/,如需轉載,請註明出處,否則將追究法律責任。

相關文章