2009-12-15 8 views
1

J'ai une base de données avec plus de 500 tables, chacune avec une structure identique, qui contient des données historiques provenant de capteurs. J'essaie de trouver une requête qui va localiser, par exemple, toutes les instances où le capteur n dépasse x. Le problème est que les tables sont dynamiques, la requête doit pouvoir obtenir dynamiquement la liste des tables.MySql: interroger plusieurs tables dynamiques identiques

Je peux interroger INFORMATION_SCHEMA.TABLES pour obtenir une liste des tables, comme ceci:

SELECT table_name 
FROM information_schema.tables 
WHERE table_schema = 'database_name'; 

Je peux l'utiliser pour créer une boucle dans le programme, puis interroger à plusieurs reprises mais la base de données, il semble que MySql devrait faire une recherche sur plusieurs tables.

Je n'ai pas été en mesure de faire une procédure stockée qui fonctionne, mais les exemples que je peux trouver sont en général pour la recherche d'une chaîne dans une colonne. Je veux trouver spécifiquement des données dans une colonne spécifique qui existe dans toutes les tables. J'avoue que je ne comprends pas comment utiliser correctement les procédures stockées ni si elles constituent la solution appropriée à ce problème.

Une requête par exemple dans la boucle serait:

SELECT device_name, sensor_value 
FROM device_table 
WHERE sensor_value > 10; 

Essayer ce qui suit ne fonctionne pas:

SELECT device_name, sensor_value 
FROM 
    (
    SELECT table_name FROM information_schema.tables WHERE table_schema = 'database_name' 
    ) 
WHERE sensor_value > 10; 

Il en résulte une erreur: « Chaque table dérivée doit avoir son propre alias. "

L'objectif est d'avoir une liste de tous les appareils qui ont eu une valeur de capteur donné lieu partout dans leur journal (tableau).

En fin de compte, si je viens de boucle dans mon programme une fois que j'ai obtenu une liste de tables, ou est-il une structure de requête qui serait plus efficace?

Répondre

0

En fin de compte pour résoudre ce problème que je reçois des résultats des tables séparées et faire mes boucles et des comparaisons dans le code. Plus tard, il a été rendu plus efficace de combiner toutes les données de capteur dans une table et d'optimiser ladite table avec des index, qui auparavant étaient manquants.

La morale de l'histoire est que la structure de la table est la clé pour éliminer beaucoup de maux de tête de codage!

1

Vous pouvez parcourir toutes les tables pour créer une seule requête dynamique comme ceci:

SELECT device_name, sensor_value FROM device_table WHERE sensor_value > 10 
UNION 
SELECT device_name, sensor_value FROM device_table2 WHERE sensor_value > 10 
UNION 
SELECT device_name, sensor_value FROM device_table3 WHERE sensor_value > 10; 
+0

Pour moi, c'est essentiellement la même chose que la boucle que je fais actuellement dans le code du programme. Je dois encore générer les noms de table pour chaque union. C'est une solution de travail, mais malheureusement pas ce que j'espérais. – JYelton

0

Vous allez devoir créer une procédure stockée. Vous aurez besoin d'un curseur en boucle qui parcourra chaque enregistrement

SELECT nom_table FROM information_schema.tables WHERE table_schema = 'nom_base_de_données';

Et alors vous aurez envie de construire une longue requête SQL comme celui fourni par jbochi

@Statement = CONCAT (@Statement, "UNION SELECT device_name, Sensor_value DE", @table_name, "OÙ Sensor_value > 10 ");

Une fois la grande requête est construite vous exectute avec

PREPARE stmt DE @Statement;

EXECUTE stmt;

DEALLOCATE PREPARER stmt;

Note: Je ne sais pas vraiment comment faire le curseur en boucle, désolé

+0

Nous sommes dans le même bateau, sur la chose du curseur en boucle! Je suppose que c'est une boucle, peu importe comment vous l'approchez. La boucle dans le code du programme fonctionne, il semble juste maladroit de faire autant d'appels à la base de données. – JYelton

+0

http://www.brainbell.com/tutorials/MySQL/Working_With_Cursors.htm Pourrait vous aider avec les curseurs. Je vais essayer cela plus tard et voir si je peux l'apprendre. – MindStalker