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
3 Réponses :
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
Comment savez-vous que la version MySQL d'OP prend en charge CTE?
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
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
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 ...