日期:2014-05-17  浏览次数:20717 次

一个关于数据库联接查询的问题,求高手解答
    首先,表结构如下:
   create table TEST
  (
     id    NUMBER not null,
     name  NVARCHAR2(100),
     name2 NVARCHAR2(100)
   )

   create table TEST1
   (
     id   VARCHAR2(28),
     name VARCHAR2(100)
   )

    create table TEST3
    (
      id   VARCHAR2(28),
      name VARCHAR2(100)
    )

插入数据:
prompt Loading TEST...
insert into TEST (id, name, name2)
values (1, '123,124', '6,7');
insert into TEST (id, name, name2)
values (2, '124,125', '7,8');
insert into TEST (id, name, name2)
values (3, '125,123', '6,8');
commit;
prompt 3 records loaded
prompt Loading TEST1...
insert into TEST1 (id, name)
values ('123', '123');
insert into TEST1 (id, name)
values ('124', '124');
insert into TEST1 (id, name)
values ('125', '125');
commit;
prompt 3 records loaded
prompt Loading TEST3...
insert into TEST3 (id, name)
values ('6', '6');
insert into TEST3 (id, name)
values ('7', '7');
insert into TEST3 (id, name)
values ('8', '8');
commit;

执行查询:
select t.id, t.name,t.name2,tt.id as test1_id,ttt.id as test3_id from test t 
left join test1 tt on tt.id in  (select * from table(splitstr(t.name,',')))
left join test3 ttt on ttt.id in  (select  * from table(splitstr(t.name2,',')))

查询结果:
行号 ID NAME    NAME2 test1_id test3_id 
1 1 123,124 6,7 123 6
2 1 123,124 6,7 123 7
3 1 123,124 6,7 124 6
4 1 123,124 6,7 124 7

5 2 124,125 7,8 123 6
6 2 124,125 7,8 123 7
7 2 124,125 7,8 124 6
8 2 124,125 7,8 124 7

9 3 125,123 6,8 123 6
10 3 125,123 6,8 123 7
11 3 125,123 6,8 124 6
12 3 125,123 6,8 124 7

从结果可以看出test1_id和test3_id两条数据从第5行开始并没按期望连接,说明这个连接查询是不正确的,这是什么问题呢?何解???????

另外,字符串分割函数如下面所述:
CREATE OR REPLACE FUNCTION splitstr(p_string IN VARCHAR2, p_delimiter IN VARCHAR2)
    RETURN str_split
    PIPELINED
AS
    v_length   NUMBER := LENGTH(p_string);
    v_start    NUMBER := 1;
    v_index    NUMBER;
BEGIN
    WHILE(v_start <= v_length)
    LOOP
        v_index := INSTR(p_string, p_delimiter, v_start);

        IF v_index = 0
        THEN
         &nbs