0
votes

Existe-t-il un moyen de sélectionner également le nombre de lignes à partir de la même requête suivante?

Pourrais-je ajouter un nombre de lignes à cette même requête ou devrais-je en créer un autre?

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 


0 commentaires

3 Réponses :


0
votes

Vous pouvez le faire avec un 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 


1 commentaires

Comment savez-vous que la version MySQL d'OP prend en charge CTE?



0
votes

En règle générale, vous devez éviter d'exécuter des sous-requêtes dans SELECT si des sous-requêtes corrélées ne sont pas nécessaires ET que vous ne disposez pas de la prise en charge de fonctions de fenêtre , (disponible dans MySQL 8+). Par conséquent, déplacez la sous-requête vers une JOIN en tant que table dérivée et pour incorporer le nombre de lignes, exécutez simplement 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


0 commentaires

0
votes
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 

2 commentaires

Comment savez-vous que la version MySQL d'OP prend en charge les fonctions de fenêtre?


@Parfait j'espère ... en général id OP n'a pas précisé la version qu'il a la plus récente ...