【问题标题】:Is there a way to also select the row count from the same following query?有没有办法从相同的以下查询中选择行数?
【发布时间】:2020-02-19 15:38:38
【问题描述】:

我能否将行数添加到同一个查询中,还是需要单独创建一个?

SELECT DISTINCT c.TABLE_SCHEMA, c.TABLE_NAME, c.COLUMN_NAME, c.DATA_TYPE, \
                ( \
                    SELECT DISTINCT p.CONSTRAINT_TYPE \
                    FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE kcu \
                        INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS p ON p.CONSTRAINT_NAME=kcu.CONSTRAINT_NAME AND p.CONSTRAINT_TYPE=\'PRIMARY KEY\' \
                    WHERE kcu.TABLE_NAME = c.TABLE_NAME AND kcu.COLUMN_NAME=c.COLUMN_NAME \
                ) AS CONSTRAINT_TYPE, NULL AS DATA_PRECISION, NULL AS DATA_SCALE \
                FROM INFORMATION_SCHEMA.COLUMNS c 

【问题讨论】:

    标签: mysql sql count rowcount


    【解决方案1】:

    你可以用cte做到这一点

        with cte as
        (
        SELECT DISTINCT c.TABLE_SCHEMA, c.TABLE_NAME, c.COLUMN_NAME, c.DATA_TYPE, 
                        ( 
                            SELECT DISTINCT p.CONSTRAINT_TYPE 
                            FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE kcu 
                                INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS p ON p.CONSTRAINT_NAME=kcu.CONSTRAINT_NAME AND p.CONSTRAINT_TYPE='PRIMARY KEY' 
                            WHERE kcu.TABLE_NAME = c.TABLE_NAME AND kcu.COLUMN_NAME=c.COLUMN_NAME 
                        ) AS CONSTRAINT_TYPE, NULL AS DATA_PRECISION, NULL AS DATA_SCALE 
                        FROM INFORMATION_SCHEMA.COLUMNS c 
        )
    select *, (select count(*) from cte)  as  _Count
    from
    cte 
    

    【讨论】:

    • 你怎么知道OP的MySQL版本支持CTE?
    【解决方案2】:

    通常,如果不需要相关子查询并且您不支持window functions,则应避免在SELECT 中运行子查询(在MySQL 8+ 中可用)。因此,将子查询移动到JOIN 作为派生表并合并行计数只需运行JOIN INFORMATION_SCHEMA.TABLES

    SELECT DISTINCT c.TABLE_SCHEMA, c.TABLE_NAME, c.COLUMN_NAME, c.DATA_TYPE, 
                    t.CONSTRAINT_TYPE, NULL AS DATA_PRECISION, 
                    NULL AS DATA_SCALE, r.TABLE_ROWS     
    
    FROM INFORMATION_SCHEMA.COLUMNS c
    
    INNER JOIN (
       SELECT DISTINCT kcu.TABLE_NAME, kcu.COLUMN_NAME, p.CONSTRAINT_TYPE
       FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE kcu
       INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS p
           ON p.CONSTRAINT_NAME = kcu.CONSTRAINT_NAME
          AND p.CONSTRAINT_TYPE = \'PRIMARY KEY\'
      ) AS t
      ON t.TABLE_NAME = c.TABLE_NAME 
      AND t.COLUMN_NAME = c.COLUMN_NAME
    
    INNER JOIN INFORMATION_SCHEMA.TABLES r
      ON r.TABLE_NAME = c.TABLE_NAME 
      AND r.TABLE_SCHEMA = c.TABLE_SCHEMA
    

    【讨论】:

      【解决方案3】:
      SELECT DISTINCT c.TABLE_SCHEMA, 
                      c.TABLE_NAME, 
                      c.COLUMN_NAME, 
                      c.DATA_TYPE, 
                      ( SELECT DISTINCT p.CONSTRAINT_TYPE 
                        FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE kcu 
                        INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS p 
                             ON p.CONSTRAINT_NAME=kcu.CONSTRAINT_NAME 
                            AND p.CONSTRAINT_TYPE='PRIMARY KEY' 
                        WHERE kcu.TABLE_NAME = c.TABLE_NAME 
                          AND kcu.COLUMN_NAME=c.COLUMN_NAME ) AS CONSTRAINT_TYPE, 
                      NULL AS DATA_PRECISION, 
                      NULL AS DATA_SCALE,
      
                      COUNT(*) OVER () total_records_count 
      
      FROM INFORMATION_SCHEMA.COLUMNS c 
      

      【讨论】:

      • 你怎么知道OP的MySQL版本支持窗口函数?
      • @Parfait 我希望...一般 id OP 没有指定他最新的版本...
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多