【问题标题】:Sybase : EXECUTE IMMEDIATE on subquerySybase:在子查询上立即执行
【发布时间】:2017-07-26 08:20:27
【问题描述】:

我正在尝试进行一个查询,该查询返回一个表的所有列的名称,并且每个列的计数不同。我有超过 1400 个表要测试,其中一些表有 100 列,所以我无法想象一个一个列名。
我对 count distinct 部分有疑问,我想知道是否可以在子查询中执行 EXECUTE IMMEDIATE 之类的操作,如果没有,是否有其他解决方案?

这是我的实际查询:

SELECT 
    sc.name AS columnName
    , ('SELECT COUNT(DISTINCT ' || sc.name || ') FROM MyTableName') AS nb_distinct_row  
FROM dbo.syscolumns sc INNER JOIN sysobjects so 
    ON so.id = sc.id 
    AND so.name = 'MyTableName'
GROUP BY sc.name

这会返回好的子查询,但我不知道如何立即执行它? 我尝试过类似

, (SELECT count(distinct sc.name) from MyTableName) As nbDistinctRow

但是 'sc.name' 没有被解释,并且 count distinct 返回 1,所以这就是我尝试这种方式的原因。

我在 sybase IQ 数据库上工作

有人可以帮助我吗? 提前谢谢你。

【问题讨论】:

    标签: sybase sqlanywhere sap-iq


    【解决方案1】:

    我找到了一种方法来完成这项工作,但它真的很笨拙。

    CREATE OR REPLACE PROCEDURE FLA_distinctCols(in table_obj_id INT)
    RESULT (column_name VARCHAR(128), count_distinct INT)
    BEGIN
        DECLARE err_notfound EXCEPTION FOR SQLSTATE VALUE '02000';
        DECLARE @tablename VARCHAR(100);
        DECLARE @cols      VARCHAR(128);
        DECLARE @nb_dist   INT;
        DECLARE @sql       VARCHAR(30000);
        DECLARE @sqltemp       VARCHAR(30000);
    
    DECLARE tables NO SCROLL CURSOR FOR
        SELECT 
            sc.name col
            , ('SELECT COUNT(DISTINCT ' || sc.name || ') INTO @nb_dist FROM ' || @tablename) 
        FROM dbo.syscolumns sc INNER JOIN sysobjects so 
            ON so.id = sc.id 
            AND so.name = @tablename 
             || '%' ORDER BY sc.name
    ;
    
    
    SELECT so.name INTO @tablename FROM sysobjects so WHERE so.id = table_obj_id;
    
    create table #tablestats (
        column_name       varchar(128) not null,
        count_distinct       INT,
    );
    
    open tables WITH HOLD;
    
    LoopTables: loop
    
        fetch next tables into @cols, @sqltemp;
    
        if sqlstate = err_notfound then
            leave LoopTables
        else
            EXECUTE IMMEDIATE WITH QUOTES @sqltemp;
            set @sql= 'INSERT INTO #tablestats SELECT ''' || @cols || ''', ' || @nb_dist || ';';
            EXECUTE IMMEDIATE WITH QUOTES @sql;
        end if
    
    end loop LoopTables;
    
    close tables;
    
    SELECT column_name, count_distinct FROM #tablestats ORDER BY count_distinct DESC;
    
    END
    
    
    GO
    BEGIN 
        DECLARE @tablename VARCHAR(128);
        DECLARE @tableid INT;
        SET @tablename = 'Mytablename';
        SELECT so.id INTO @tableid FROM sysobjects so WHERE so.name = @tablename;
    
        SELECT * FROM FLA_distinctCols(@tableid);
    
    END
    

    还有其他解决方案吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-05
      • 2020-12-08
      • 1970-01-01
      • 2018-10-14
      • 1970-01-01
      相关资源
      最近更新 更多