需求如下:有M表,N表2个表 现在需要根据一定条件去取M中的一个字段A,但是还有一个特殊的需求是当A不存在时,根据M表中的B字段去向N表中差对应的D字段可能说不明白,列举下.M表 记录1 A 01 B 00 C 02
    记录2 A 空 B 00 C 02  N表 B 00 D 03这时候查C=02是的记录,希望可以用一条语句查出来的结果是 01 03.请问这条SQL应该怎么写,头疼了一下午

解决方案 »

  1.   

    select nvl2(M.A,M.A,N.D)
    from M full join N
    on M.B = N.B
    where C='02'
      

  2.   

    select nvl2(M.A,M.A,N.D)
    from M full join N
    on M.B = N.B
    where C='02'
      

  3.   


    create table M (Col1 varchaer2,Col1 varchaer2,Col1 varchaer2, )
    M表 记录1 A 01 B 00 C 02
        记录2 A 空 B 00 C 02  N表 B 00 D 03 select A.Col2,case when A.Col2 is null then  B.Col4 end
    from M A left jon N B
    on A.Col2 = B.Col1
    这样行不?
      

  4.   

    SELECT M.*
    FROM M
    WHERE NOT EXISTS(SELECT 1 FROM N WHERE M.字段A=N.字段D)
      

  5.   

    上面不对,应该这样:
    SELECT CASE WHEN NVL(M.A,'')='' THEN M.A ELSE N.D END A,M.B,M.C
    FROM M
    LEFT JOIN N ON M.B=N.D
    WHERE M.C='02';
      

  6.   

    修改:SQL> create table M(a varchar2(10),b varchar2(10),c varchar2(10));表已创建。SQL> insert into m values('01','00','02');已创建 1 行。SQL> insert into m values(null,'00','02');已创建 1 行。SQL> commit;提交完成。SQL> create table N(b varchar2(10),d varchar2(10));表已创建。SQL> insert into n values('00','03');已创建 1 行。SQL> SELECT CASE WHEN M.A is not null THEN M.A ELSE N.D END A,M.B,M.C 
      2  FROM M 
      3  LEFT JOIN N ON M.B=N.D 
      4  WHERE M.C='02'; A          B          C
    ---------- ---------- ----------
               00         02
    01         00         02
      

  7.   


    hdhai9451 的SQL写的好,我的就不贴出来了,理论上看起来差了点啊!
      

  8.   

    SELECT DECODE(M.A,NULL,N.B,M.A) FROM M,N WHERE M.B=N.B
      

  9.   

    我觉得各位没有理解楼主的意思,我个人觉得楼主的意思用一个sql出不来结果