原贴地址:
http://community.csdn.net/Expert/topic/5660/5660584.xml?temp=.575741他提问如下:
  bianh mingxh xmingc
000001 000030 左眼000001 000031 右眼000001 000032 色觉000067 000001 视力检查000067 000019 彩超000067 000020 总胆红素000068 000003 心电图检查000068 000004 转氨酶
以下是我要问的
我想执行一条SQL语句后,如下显示
bianh  mingxh mingc000067 000030 左眼000067 000031 右眼000067 000032 色觉 000067 000019 彩超000067 000020 总胆红素
请问这条SQL语句如何写?我的回答:
SELECT
  CASE WHEN T5.BIANH1 = T5.MINGXH2 THEN T5.BIANH2  ELSE T5.BIANH1 END AS BIANH, T5.MINGXH1 AS MINGXH
FROM 
(SELECT
   T3.BIANH AS BIANH1, T3.MINGXH AS MINGXH1, T3.XMINGC, T4.MINGXH AS MINGXH2, T4.BIANH AS BIANH2
 FROM TEMP2 T3
  LEFT JOIN
 
 (SELECT 
    T2.Col4 AS BIANH, T2.COL5 AS MINGXH
  FROM
    (SELECT BIANH AS Col1 FROM TEMP2) T1
     INNER JOIN 
    (SELECT BIANH AS Col4, MINGXH AS Col5 FROM TEMP2) T2 
     ON T1.Col1 = T2.Col5
  WHERE NVL(T2.COL4,0) <> 0) T4
  ON T3.BIANH = T4.MINGXH
) T5
WHERE (T5.BIANH1 || T5.MINGXH1) <> (NVL(T5.BIANH2,'SSSSS') || NVL(T5.MINGXH2,'SSSSS'))
我的做法显然只连接上了一条数据,为什么?谢谢

解决方案 »

  1.   

    我理解的问题的意思是:
    bianh mingxh xmingc 三个字段
    但是某条数据可能不是最终结果,只是中间的,
    例如:000067 000001 视力检查
    即  000001 是 视力检查 
    但是视力检查还分几个小项目
        000001 000030 左眼
        000001 000031 右眼
        000001 000032 色觉
     对  000067 来说 视力检查 是   000001 
     对  000068 来说 视力检查 可能就是 000002 了
    而问题问的是要显示所有的最终结果:
        bianh mingxh xmingc 
        000067 000030 左眼
        000067 000031 右眼
        000067 000032 色觉 
        000067 000019 彩超
        000067 000020 总胆红素
    然后是我的思路:
        首先找到 bianh 和mingxh 相同的(即中间的结果)
        然后对满足可以连接的数据做连接结果: 满足 000001的数据有三条      bianh mingxh xmingc
                                        000001 000030 左眼
                                        000001 000031 右眼
                                        000001 000032 色觉
    ,而我只连接上了第一条虽然我的法不知道能不能满足他的需求,但是
    只就我的做法而论,只连接了一条,我没有弄明白原因
    请指教
      

  2.   

    你的語句寫的太複雜了,我沒有去分析。我是這麼寫的,在MS SQL中可以實現,在ORACLE中應該也可以。Select 
    A.bianh,
    IsNull(B.mingxh, A.mingxh) As mingxh,
    IsNull(B.xmingc, A.xmingc) As xmingc
    From
    TEST A
    Left Join
    TEST B
    On A.mingxh = B.bianh
    Where A.bianh = '000067'
      

  3.   

    以下是在MS SQL中測試OK的代碼--創建測試環境
    Create Table TEST
    (bianh Char(6),
     mingxh Char(6),
     xmingc Nvarchar(20))
    --插入數據
    Insert TEST Select '000001', '000030', N'左眼'
    Union All Select '000001', '000031', N'右眼'
    Union All Select '000001', '000032', N'色觉'
    Union All Select '000067', '000001', N'视力检查'
    Union All Select '000067', '000019', N'彩超'
    Union All Select '000067', '000020', N'总胆红素'
    Union All Select '000068', '000003', N'心电图检查'
    Union All Select '000068', '000004', N'转氨酶'
    GO
    --測試
    Select 
    A.bianh,
    IsNull(B.mingxh, A.mingxh) As mingxh,
    IsNull(B.xmingc, A.xmingc) As xmingc
    From
    TEST A
    Left Join
    TEST B
    On A.mingxh = B.bianh
    Where A.bianh = '000067'
    GO
    --刪除測試環境
    Drop Table TEST
    --結果
    /*
    bianh mingxh xmingc
    000067 000030 左眼
    000067 000031 右眼
    000067 000032 色觉
    000067 000019 彩超
    000067 000020 总胆红素
    */
      

  4.   

    哦,忘了。將ISNULL改為NVL,ORACLE使用NVL。
      

  5.   

    TO paoluo(一天到晚游泳的鱼) ( ) 信誉:100:
    原先的那个帖子已经结帖了,你的拿到那里是可以拿到分的
    但是我想得到所有的纪录,而不是你写的这种只针对000067的
    所以才有了上面的我写的SQL
    再帮忙分析下?
      

  6.   

    LighBlade(菜鸟加加油!!!) ( ) 信誉:100  2007-8-13 10:56:23  得分: 0  
     
     
       
    TO paoluo(一天到晚游泳的鱼) ( ) 信誉:100:
    原先的那个帖子已经结帖了,你的拿到那里是可以拿到分的
    但是我想得到所有的纪录,而不是你写的这种只针对000067的
    所以才有了上面的我写的SQL
    再帮忙分析下?  
     
    ----------
    "我想得到所有的纪录",什麼意思?結果是怎樣的?
      

  7.   

    SELECT BIANH,MINGXH,XMINGC FROM (
        SELECT NVL((SELECT BIANH FROM TEST WHERE MINGXH=A.BIANH AND ROWNUM=1),A.BIANH) BIANH,
            A.MINGXH,A.XMINGC,
            NVL((SELECT BIANH FROM TEST WHERE BIANH=A.MINGXH AND ROWNUM=1),'NODEL') DEL
        FROM TEST A
    ) WHERE DEL='NODEL'
    最好使用存储过程,使用中间表,提高效率
      

  8.   

    TO  paoluo(一天到晚游泳的鱼) ( ) 信誉:100 :
        你似乎没有看清楚我的说明:
        000067 只是bianh 和mingxh 相同的的纪录中的一条,
        这样的纪录有可能还有多条(当然,现有数据只有这一条是满足的)
        所以你的sql中的Where A.bianh = '000067' 直接局限了纪录结果
        请再帮忙看一下?TO  dragon188(兰若寺) ( ) 信誉:100  :
        你确信已经满足我说的要求了吗?
        请再帮忙看一下?
        其实我的sql 不是最后的版本,最后应该是除去    
        000067 000001 视力检查 这一条数据的(即中间数据,连接数据)
        我开这个帖子主要是想问一下,为什么只连接上了第一条
        请大家再帮下忙! 谢谢
      

  9.   

    为什么我们3个sql 语句在我这里执行都只能连接上第一条
    跟环境有关系吗 (xp,Oracle9i)