SQL 的子查询有时候可以给我们提供很多方便,但是用不好,可能会让你痛苦不坎。先说一下我的教训吧,希望看过的人不要重犯。我经常要写一些业务比较复杂SQL,子查询必须有的。最近生产环境报了几个问题都是子查询反回结果不唯一造成的,幸好客户不懂这个,不然不把我劈了才怪。当然,我自己看到这个也非常的痛苦。
    为了让自己长点记性,也希望不懂这方面的朋友避免这样的痛苦,写一点我的解决办法。如果你有更好的我们可以相互学习,如果你觉得这是扯蛋,先把砖准备好:    SELECT A字段,
           B字段,
           C字段,
           (SELECT D字段 FROM TABLE WHERE XXXX AND XXXX) AS D字段
    FROM TABLE..
    WHERE ....我自己的解决办法:
    1)如果你非常清楚你自己写的子查询不会反回多条记录,哪你就按教科书讲的写。
    2)如果你不清楚,但你知道数据库中有充足的数据可以测试这个,哪你写好后就先在最少条件的情况下查询一次,如果正常且数据不会增加或都这样,哪你什么也不用做。
    3)如果你不清楚上面两条,请记住,一定要想办法保证子查询能够反回唯一的值,不管是对的还是错的。我想有两种办法:
     a) SELECT A字段,
           B字段,
           C字段,
           (SELECT D字段 FROM TABLE WHERE XXXX AND XXXX AND ROWNUM<2) AS D字段
    FROM TABLE..
    WHERE ....
    b)SELECT A字段,
           B字段,
           C字段,
           (SELECT MAX(D字段) FROM TABLE WHERE XXXX AND XXXX) AS D字段
    FROM TABLE..
    WHERE ....
    当然你也可以用MIN()
    
    我想写到这里,有的朋友可能要拍砖了,我自己的感受是对于客户,对与错是另外一个问题。能不能运行就是态度问题,当他在使用你开发的产品时,如果有错误,他可能会想到测试不到位,或当时业务没搞清楚。你也有理由瞎扯,但如果突然运行不了,客户的情绪可能会更遭。    当然这不是解决问题的根本方法,但我觉得这个方法适合我的开发。因为我要面对的数据库相当复杂,用户提出的需求我觉得用太简单来形容还有点不能表达完整。也许有人要说这是一种很不规范的开法方式,我一直都这样认为的。但我觉得软件工程,项目管理之类的书我也看了不少。有好多事,不是书上写的那么单纯。