是否有办法也从相同的后续查询中选择行数?

问题描述 投票:0回答:2

我是否可以向同一查询添加行数,还是需要创建一个单独的行数?

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
2个回答
0
投票

您可以通过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 

0
投票

[通常,如果不需要关联的子查询并且不支持SELECT,则应避免在window functions中运行子查询(在MySQL 8+中可用)。因此,将子查询作为派生表移至JOIN,并合并行数,请在JOIN中添加另一个派生表:

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, agg.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 (
     SELECT TABLE_SCHEMA, TABLE_NAME, TABLE_ROWS
     FROM INFORMATION_SCHEMA.TABLES
) r
  ON r.TABLE_NAME = c.TABLE_NAME 
  AND r.TABLE_SCHEMA = c.TABLE_SCHEMA

0
投票
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, agg.TABLE_ROWS     

             , COUNT(*) OVER () total_records_count

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 (
     SELECT TABLE_SCHEMA, TABLE_NAME, TABLE_ROWS
     FROM INFORMATION_SCHEMA.TABLES
     GROUP BY TABLE_SCHEMA, TABLE_NAME
) agg
  ON agg.TABLE_NAME = c.TABLE_NAME 
  AND agg.TABLE_SCHEMA = c.TABLE_SCHEMA
© www.soinside.com 2019 - 2024. All rights reserved.