2010-11-28 10 views

Répondre

2

SQL LEFT JOIN renvoie toutes les lignes de la table de gauche, même s'il n'y a aucune correspondance dans la table droite

SELECT name, id 
FROM record r LEFT JOIN share s on r.id = s.id 
WHERE s.id is null 
2

Vous avez cette table: RECORD (ID, NOM) SHARE (ID, VALUE)

Si votre moteur SQL supporte LEFT OUTER REJOINT, la meilleure façon est:

SELECT RECORD.* FROM RECORD LEFT OUTER JOIN SHARE WHERE RECORD.ID=SHARE.ID 
WHERE SHARE.ID IS NULL 

Important
place un index sur SHARE.ID

Comment ça marche:
SQL durée de moteur toute la table RECORD à la recherche d'un dossier de la part, pour chaque enregistrement RECORD si on trouve un dossier « lié » PARTAGEE la clause where est falso, donc l'enregistrement n'est pas inclus dans le jeu de résultats, si aucun enregistrement n'est trouvé dans share, la clause where est vraie et le RECORD. * est inclus dans le jeu de résultats. Cela fonctionne grâce à LEFT OUTER JOIN.

Note:
Une autre façon de faire la même chose est d'utiliser la clause WHERE RECORD.ID NOT IN (SELECT ID DE PART). Faites attention à ce que, selon le moteur sql que vous utilisez, cela peut entraîner de sérieux problèmes de performances car le moteur interne peut exécuter (SELECT ID from Share) une fois par enregistrement dans la table RECORD.

+0

merci beaucoup pour l'expliquer. cela m'aide beaucoup. – riyana

1

Select from t1 où id pas (id sélectionner à partir de t2)

0

SELECT * de RECORD où ID pas (SELECT DISTINCT ID DE PART);

SELECT ID DISTINCT DE PARTAGER - auront tous les ID distincts de la part de la table

SELECT * de RECORD où ID pas (SELECT ID DISTINCT DE PART); affichera tous les enregistrements dont l'ID ne figure pas dans la première requête.