2012-01-15 6 views
2

J'ai les tables suivantes;union de deux tables - intersection de deux tables

A B      A B 
_____      _____ 
1 t      7 a 
2 r      5 d 
3 e      3 e 
4 f      9 a 
5 d      10 c 
6 s      11 a 
7 a 

Et, la sortie devrait être;

A B      
_____      
1 t      
2 r      

4 f 

6 s 

9 a 
10 c 
11 a 

En d'autres termes, je veux quelque chose de vraiment différent. Je peux seulement dire avec this figure, jetez un oeil à. Je veux (Un syndicat B). Comment puis-je faire cela?

+2

Effectuer l'union (tous), le nombre de groupe et filtre> 1 – nan

+1

Qu'est-ce que vous voulez est le * complément * d'une union B ou l'intersection du complément de A avec le complément de B (De Morgan's Law). En outre, la question serait plus claire si vous étiquetez vos colonnes différemment de vos tables (les deux sont A et B). –

+0

En outre, votre diagramme ne précise pas vraiment ce que vous voulez en tant que C! = La sortie attendue décrite dans la question. –

Répondre

4

Cette requête fera. Il charge tous les enregistrements des deux tables, affiche alors tous ceux qui existent une fois

SELECT 
    A, B 
FROM 
    (SELECT A, B FROM TABLE1 
    UNION ALL 
    SELECT A, B FROM TABLE2) 
    AS COMBINED 
GROUP BY 
    A, B 
HAVING 
    COUNT(*) = 1 
ORDER BY A; 
+1

vient de remarquer. C'est exactement ce que dit Andrzej Nosal – Gary

+0

Gary, J'essaye simplement de charger tous les enregistrements de toutes les colonnes dans deux petites tables pour une requête SQLite dans Android Studio. Mais je me bats avec la syntaxe. Savez-vous ce que je fais mal ici? String select = "SELECT * FROM (SELECT * FROM" + TOTALCOUNT + "UNION TOUT SELECT * FROM" + USERINPUTS) + "AS COMBINED"; – AJW

+0

@AJW Probablement le meilleur si vous le soulevez comme une question distincte donc ce n'est pas juste moi qui le regarde. Je n'ai aucune expérience d'Android Studio – Gary

-1

simplement

SELECT a, b FROM table1 UNION SELECT a, b FROM table2; 
+0

Tandis que techniquement c'est la bonne réponse à (Une union B) il devrait être évident à la lecture du reste de la question que ce n'est pas ce que le questionneur exige. –

0
SELECT iResult.* 
FROM 
    (SELECT A, B 
    FROM tableA 
    WHERE A NOT IN 
     (SELECT Distinct A FROM tableB) 
    UNION 
    SELECT A, B 
    FROM tableB 
    WHERE A NOT IN 
     (SELECT Distinct A FROM tableB)) as iResult 
1
SELECT f.A, f.B 
FROM firstTable f 
LEFT JOIN secondTable s ON (f.A = s.A) 
WHERE (s.A IS NULL) 
UNION 
SELECT s.A, s.B 
FROM firstTable f 
RIGHT JOIN secondTable s ON (f.A = s.A) 
WHERE (f.A IS NULL) 
0
SELECT A, B 
FROM Table1 

UNION 

SELECT A, B 
FROM Table2 

EXCEPT 

SELECT t1.A, t1.B 
FROM Table1 t1 
    INNER JOIN Table2 t2 ON t1.A = t2.A AND t1.B = t2.B 
+0

C'est élégant, mais il est à noter que MySQL ne supporte toujours pas EXCEPT *, même si c'est la norme SQL 92. * A partir de la version 5.0.13 –

+1

@TimGee: Je pense que vous devez avoir raison. Pourtant, la question est étiquetée 'sqlite' pour le moment. :) –

+0

Peut remplacer la dernière partie (jointure interne) avec 'SELECT A, B FROM Table1 INTERSECT SELECT A, B FROM Table2' et ajouter des parens pour la clarté et la sécurité parce que la priorité pour' INTERSECT', 'EXCEPT' et' UNION' dépend de l'implémentation. – onedaywhen

0

Modifier enlevé avant « solution » puisque je l'ai réalisé est le même que celui proposé par Gary .

(select a, b from table_1 minus 
select a, b from table_2)  union 
(select a, b from table_2 minus 
select a, b from table_1); 

Cela a semblé fonctionner avec les données followoing sur Oracle:

create table table_1 (
    a number, 
    b varchar(2) 
); 

create table table_2 (
    a number, 
    b varchar(2) 
); 


insert into table_1 values (1 ,'t'); 
insert into table_1 values (2 ,'r'); 
insert into table_1 values (3 ,'e'); 
insert into table_1 values (4 ,'f'); 
insert into table_1 values (5 ,'d'); 
insert into table_1 values (6 ,'s'); 
insert into table_1 values (7 ,'a'); 

insert into table_2 values (7 ,'a'); 
insert into table_2 values (5 ,'d'); 
insert into table_2 values (3 ,'e'); 
insert into table_2 values (9 ,'a'); 
insert into table_2 values (10 ,'c'); 
insert into table_2 values (11 ,'a'); 
+0

Je ne pense pas que MINUS est un standard SQL, bien que je soupçonne que tout ce que vous devez faire est de le changer à SAUF pour une meilleure compatibilité. Même ainsi, MySQL ne supporte pas EXCEPT. –