2
votes

Comment exécuter la requête suivante?

Je dois les tableaux A et B. La relation est un à plusieurs. Dans le tableau B ont une clé étrangère de A.

select TABLE_A.id, COUNT(TABLE_B.f)  
from TABLE_A JOIN TABLE_B 
   ON (TABLE_A.id = TABLE_B.f) 
GROUP BY TABLE_A.id HAVING COUNT(TABLE_B.f) = 0; 

Comment obtenir tout A sans B?

La requête ci-dessous ne fonctionne pas.

TABLE A:
   ... fields

TABLE B:
   f = foreignkey(A)


1 commentaires

La réponse est sélectionnez TABLE_A.id, COUNT (TABLE_B.f) from TABLE_A LEFT JOIN TABLE_B ON (TABLE_A.id = TABLE_B.f) GROUP BY TABLE_A.id HAVING COUNT (TABLE_B.f) = 0;


4 Réponses :


1
votes

Utilisez n'existe pas ?

select a.*
from table_a a
where not exists (select 1
                  from table_b b
                  where a.id = b.f
                 );

Ou pas dans . Ou jointure gauche avec where.


0 commentaires

3
votes

Remplacez JOIN par LEFT JOIN :

TABLE_A.id, COUNT(TABLE_B.f) 
from TABLE_A 
LEFT JOIN TABLE_B ON (TABLE_A.id = TABLE_B.f) 
GROUP BY TABLE_A.id 
HAVING COUNT(TABLE_B.f) = 0;


2 commentaires

Avec cette jointure gauche, vous ne devriez rien compter.


@HaakonDahl, veuillez écrire une requête.



0
votes

Vous pouvez effectuer un LEFT JOIN et prendre uniquement les lignes qui ont NULL dans la colonne TABLE_B.f ,
signifiant qu'il n'y a pas de TABLE_B.f pour correspondre à TABLE_A.id:

SELECT DISTINCT TABLE_A.id  

en supposant que TABLE_A.id code > est unique dans TABLE_A ,
sinon utilisez

SELECT TABLE_A.id  
FROM TABLE_A LEFT JOIN TABLE_B 
ON TABLE_A.id = TABLE_B.f 
WHERE TABLE_B.f IS NULL;


0 commentaires

0
votes

Vous pouvez utiliser la jointure de gauche et vérifier la nullité sur la table de droite.

SELECT TABLE_A.id,count(*)  
FROM TABLE_A LEFT JOIN TABLE_B 
ON TABLE_A.id = TABLE_B.f 
WHERE TABLE_B.f IS NULL
group by TABLE_A.id;


0 commentaires