84 votes

Sélectionner à partir de plusieurs tables sans jointure ?

Quel est le moyen le plus simple de sélectionner des données dans deux tableaux et de les faire apparaître comme des lignes distinctes plutôt que de les joindre ? Les deux tables ont des champs similaires ou correspondants et je veux exécuter une fonction d'agrégation sur eux, comme la moyenne de toutes les lignes qui se sont produites au cours du même mois, à partir des deux tables.

Par exemple, j'ai deux tables, l'une qui montre les transactions d'un système et l'autre qui montre les transactions d'un autre système. Existe-t-il un moyen de récupérer toutes les transactions des deux tables sous forme de lignes séparées ? Si la table 1 contient vingt enregistrements et la table 2 trente enregistrements, j'aimerais qu'il y ait 50 lignes dans le retour.

71voto

Marco Points 29879

Vous pourriez essayer quelque chose comme ceci :

SELECT ...
FROM (
    SELECT f1,f2,f3 FROM table1
    UNION
    SELECT f1,f2,f3 FROM table2
)
WHERE ...

44voto

spencer7593 Points 29263

En UNION ALL L'opérateur peut être ce que vous recherchez.

Cet opérateur permet de concaténer les ensembles de résultats de plusieurs requêtes, en conservant toutes les lignes de chacune d'entre elles. Notez qu'une requête UNION (sans l'opérateur ALL ) éliminera toutes les lignes "en double" qui existent dans le jeu de résultats. Le mot-clé UNION ALL préserve toutes les lignes de chaque requête (et sera probablement plus performant puisqu'il n'a pas à effectuer la vérification des doublons et l'opération de suppression).

Le nombre de colonnes et le type de données de chaque colonne doivent correspondre dans chacune des requêtes. Si l'une des requêtes comporte plus de colonnes que l'autre, nous incluons parfois des expressions fictives dans l'autre requête pour que les colonnes et les types de données "correspondent". Souvent, il est utile d'inclure une expression (une colonne supplémentaire) dans la liste SELECT de chaque requête qui renvoie un littéral, afin de révéler laquelle des requêtes était la "source" de la ligne.

SELECT 'q1' AS source, a, b, c, d FROM t1 WHERE ...
UNION ALL
SELECT 'q2', t2.fee, t2.fi, t2.fo, 'fum' FROM t2 JOIN t3 ON ...
UNION ALL
SELECT 'q3', '1', '2', buckle, my_shoe FROM t4

Vous pouvez envelopper une telle requête dans un ensemble de parenthèses et l'utiliser comme une vue en ligne (ou "table dérivée", dans le jargon de MySQL), afin de pouvoir effectuer des opérations d'agrégation sur toutes les lignes.

SELECT t.a
     , SUM(t.b)
     , AVG(t.c)
  FROM (
         SELECT 'q1' AS source, a, b, c, d FROM t1
          UNION ALL
         SELECT 'q2', t2.fee, t2.fi, t2.fo, 'fum' FROM t2
       ) t
 GROUP BY t.a
 ORDER BY t.a

43voto

wojciechz Points 346

Vous pouvez essayer cette note :

SELECT * from table1,table2 

Plus compliqué :

SELECT table1.field1,table1.field2, table2.field3,table2.field8 from table1,table2 where table1.field2 = something and table2.field3 = somethingelse

13voto

Vinay Kumar Points 151

Si votre question était la suivante -- Select ename, dname FROM emp, dept sans utiliser de jointures

Ensuite, je ferais ceci...

SELECT ename, (SELECT dname 
FROM dept
WHERE dept.deptno=emp.deptno)dname
FROM EMP

Sortie :

ENAME      DNAME
---------- --------------
SMITH      RESEARCH
ALLEN      SALES
WARD       SALES
JONES      RESEARCH
MARTIN     SALES
BLAKE      SALES
CLARK      ACCOUNTING
SCOTT      RESEARCH
KING       ACCOUNTING
TURNER     SALES
ADAMS      RESEARCH

ENAME      DNAME
---------- --------------
JAMES      SALES
FORD       RESEARCH
MILLER     ACCOUNTING

14 rows selected.

8voto

Vous devriez essayer ceci

 SELECT t1.*,t2.* FROM t1,t2

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X