2010-11-11 6 views
2

Ceci est une extension du concept de table « double » (table temporaire créée à la volée pour une requête et mis au rebut immédiatement après)ligne multi-tables « double » dans une base MySQL/SQL

Je suis en train de se joindre à un multi row dual table avec une autre, afin d'éviter d'avoir à exécuter la même requête plusieurs fois avec des paramètres différents, en utilisant 1 instruction. L'un des problèmes que je rencontre est que l'union est très lente pour les tables doubles, et je ne connais pas de méthode plus efficace pour accomplir ce qui suit. (100 ms en joignant 50 dual ensemble)

SELECT 
    b.id, 
    b.ref_unid, 
    a.date 
    FROM 
    (
    SELECT 
     'b8518a84-c501-11dd-b0b6-001d7dc91168' as unid, 
     '2010-01-05' as date 
    UNION 
    SELECT 
     'b853a1f2-c501-11dd-b0b6-001d7dc91168', 
     '2010-01-06' 
    UNION 
    SELECT 
     'b8557bd0-c501-11dd-b0b6-001d7dc91168', 
     '2010-01-07' 
    /* ... */ 
) as a 
    join other_table b 
     ON 
     b.ref_unid = a.unid 

Existe-t-il une autre façon d'atteindre cet objectif?

Y at-il une syntaxe similaire à celle d'insérer dans la déclaration des valeurs qui permettrait d'atteindre cet objectif, comme:

SELECT 
    unid, 
    id 
    FROM 
    (
     WITH (unid, date) USING VALUES 
     (
     ('b8518a84-c501-11dd-b0b6-001d7dc91168','2010-01-05'), 
     ('b853a1f2-c501-11dd-b0b6-001d7dc91168','2010-01-06'), 
     ('b8557bd0-c501-11dd-b0b6-001d7dc91168','2010-01-07'), 
     /* ... */ 
    ) 
    ) as a 
    join other_table b 
     ON 
     b.ref_unid = a.unid 

Je suis à la recherche d'une solution 1-déclaration. Plusieurs trajets vers la base de données ne sont pas possibles.

Répondre

1

Il n'y a pas d'autre convention à ma connaissance disponible dans MySQL pour construire une table dérivée dans une seule instruction. S'il s'agissait d'une seule colonne, à ~ 50 valeurs, il pourrait être converti pour utiliser une clause IN.

L'approche la plus performante consiste à charger les données dans une table sous une forme ou une autre - en MySQL, pour une utilisation temporaire, je vous recommande d'utiliser le moteur MEMORY. À ~ 50 tuples, je dois me demander pourquoi les données ne sont pas déjà dans la base de données ...

+0

L'API que je code permet de passer une liste de tuples et retourne une liste d'objets pour chacun de ces tuples. Étant donné que le nombre de tuples transmis est généralement compris entre 10 et 50, j'essaie d'éviter d'appeler une requête 50 fois, en changeant simplement quelques paramètres. J'ai essayé d'utiliser l'instruction multiple IN, mais elle n'utilise aucun des index existants, contrairement à l'approche ci-dessus qui est très rapide en dehors de l'union de tables doubles. –

Questions connexes