(Oracle ,delphi)我想做一个Sql的解释器,分析一个SQL语句里有哪些表,
对一些简单的sql(例1,2) 可以很容易得出,但对于一些很复杂的sql(例3)
就难了,有哪位高手写过这样的通用的分析?  例1:
SELECT A.F_BARCODE,B.F_COUNT
FROM TCOMMODITY A , TEXPORTCONTENT  B
WHERE A.F_BARCODE=B.F_BARCODE 
AND A.F_BARCODE>'02'
含有表 TCOMMODITY , TEXPORTCONTENT例2:
SELECT * FROM TIMPORTBILL 
含有表 TIMPORTBILL
   
例3:SELECT  T.* ,Z.*,K.*
FROM   
(
SELECT A.F_BARCODE,B.F_COUNT
FROM TCOMMODITY A , TEXPORTCONTENT  B
WHERE A.F_BARCODE=B.F_BARCODE 
AND A.F_BARCODE>'02'
) ,
( SELECT F_DF FROM  TDDC
)B,TIMPORT C, TEXPORT  D,
( SELECT  FROM TBIL  ) K
WHERE ....含有表:TCOMMODITY , TEXPORTCONTENT,TDDC,TIMPORT TEXPORT,TBIL

解决方案 »

  1.   

    这个算法很恐怖的....你还没有算上左右连接呢:( left join
      

  2.   

    解析SQL只是比较麻烦而已,并没有技术上的难点。按照编译原理的语法分析方式应该可以编出很好的解析程序,只是程序可能长点。坚决支持你的行动!
      

  3.   

    http://www.delphibbs.com/delphibbs/dispq.asp?lid=226555
    Delphi MIDAS 的重大BUG / 李颖   function TQuery.PSGetTableName: string;
      begin
        Result := GetTableNameFromSQL(SQL.Text);
      end;
    其中GetTableNameFromSQL定义在DBCommon.pas中,各位,这下发现宝贝了!!!!
    这个单元里包括一些SQL语法分析程序,定义相当完备,
    比如这个GetTableNameFromSQL函数分析一段SQL语句的目标表名,
    只用了20行就搞定了,是不是很厉害??这个单元没有包括在Delphi Help中,也不算很复杂,interface部分只有230行左右
    快去看看吧,肯定有收获
      

  4.   

    GetTableNameFromSQL(SQL.Text);
    是单表的,多表的不行.有高手吗?
      

  5.   

    如果不算子查询的话,倒是比较好算!比如:select a.id ,b.mc,c.* from aaa a,bbb b,ccc c where ... group ...order... ;1\先算出from的位置,去掉头部得到如下:
    aaa a,bbb b,ccc c where ....;
    2\查询空格符,判断空格后面的单词是否是where/group/order,如果是则去掉尾,那么就得到如下:
    aaa a,bbb b,ccc c
    3\查询逗号得出表的数组!!!
      

  6.   

    同意smilelhh(blue)的,只要找出from...where,或者 from...)或者from..group或者from....order等等,的位置。然后利用逗号分组。