2011-04-13 4 views
0

Tableau 1 Num1 (tableau de référence vient de 0 à 99)SQL, SQLite Sélectionnez à partir de 3 tables

Tableau 2 a la date, Résultat (a de nombreux enregistrements uniques par date et résultat)

Tableau 3 a Résultat, num1, Num2, NUM3

Je REJOINDRE Tableau 2 par Résultat dans le tableau 3 et correspondre chaque tableau 1 num1 à l'un des num1 ou Num2 ou NUM3 dans le tableau 3 Lorsque la date est < une date Grouper par le tableau 1 donc seulement 100 lignes sont retournées.

Comment l'arrête-t-on une fois s'il trouve le 100 correspondant? Il semble balayer complètement le tableau 2 à chaque fois. Quand je rentre à la fin de la table select va plus vite

+0

Quel est le troisième tableau référencé dans le titre? Quel est le nom de la colonne dans Table1? Que cherchez-vous exactement? La façon dont l'optimiseur analyse une table est principalement un problème pour l'optimiseur. Avez-vous des index appropriés en place? –

Répondre

0

Superficiellement, cela pourrait être ce que vous recherchez:

SELECT Num1 AS Num FROM Table2 WHERE Date < '2011-04-12' 
UNION 
SELECT Num2 AS Num FROM Table2 WHERE Date < '2011-04-12' 
UNION 
SELECT Num3 AS Num FROM Table2 WHERE Date < '2011-04-12' 

Ceci permet de sélectionner les valeurs uniques de Num1, Num2 et NUM3 dans Tableau2.

Il n'est pas clair pourquoi vous avez besoin Table1; cependant, il serait possible de joindre ce résultat avec les valeurs du tableau 1 pour s'assurer que les valeurs sélectionnées apparaissent dans le tableau 1.

Il n'est pas clair où la troisième table référencée dans le titre est, ce qu'elle contient, ou comment elle pourrait être jointe.

Si, comme je m'attends, cela manque le point de la question, vous devez clarifier soigneusement ce que vous espérez voir.

0

Pour limiter le nombre d'enregistrements renvoyés par une requête SELECT, vous pouvez utiliser la clause LIMIT.

J'ai essayé de distiller une requête qui correspond à ce que je pouvais comprendre de votre requête. Mais puisque votre explication était un peu cryptique, les chances sont que je ne comprends pas bien ce que vous voulez:

SELECT Table3.Num1 
    ,  Table3.Num2 
    ,  Table3.Num3 
    FROM Table3 
     INNER JOIN Table2 
       ON Table3.Result = Table2.Result 
     INNER JOIN Table1 
       ON Table1.Num1 IN (Table3.Num1, Table3.Num2, Table3.Num3) 
    WHERE Table2.Date < '2011-04-13' 
ORDER BY Table2.Date 
    LIMIT 100 -- this will make sure only the first 100 records are returned 
    ; 

Si ce fait faire ce que vous voulez, alors vous devriez probablement envisager redessiner vos tables. Avoir à comparer Table1 aux trois tableaux3.Num1, Num2 et Num3 me semble très étrange, et plus important encore, très inefficace pour moi.

Questions connexes