2009-04-26 9 views
1

je la requête suivante:Comment savoir si une ligne n'existe pas?

SELECT rowid FROM table1 ORDER BY RANDOM() LIMIT 1 

Et ainsi je une autre table (table3). Dans cette table j'ai les colonnes table1_id et table2_id. table1_id est un lien vers une ligne de la table1 et table2_id est un lien vers une ligne d'une autre table.

Je veux dans ma requête obtenir uniquement les résultats définis dans le tableau3. Seuls ceux qui ont table1 rowid dans leur colonne table1_id. Il n'y a peut-être aucune colonne faisant référence à un certain tableau1 rowid donc dans ce cas je ne veux pas les recevoir.

Comment puis-je atteindre cet objectif?

Mise à jour: J'ai essayé la requête suivante, qui ne fonctionne pas:

SELECT rowid FROM table1 
WHERE rowid IN (SELECT table1_id FROM table3 WHERE table1_id = table1.rowid) 
ORDER BY RANDOM() LIMIT 1 

Répondre

1
SELECT rowid FROM table1 
WHERE rowid IN (SELECT DISTINCT table1_id FROM table3) 
ORDER BY RANDOM() LIMIT 1; 

Cette requête signifie « choisir au hasard une ligne de table1 qui a une entrée dans table3 ».

Chaque ligne de la table1 est égale à la probabilité d'être sélectionnée (DISTINCT) tant qu'elle est référencée au moins une fois dans table3.

Si vous tentez d'obtenir plusieurs résultats, supprimez la clause "ORDER BY RANDOM() LIMIT 1".

1

En supposant que vous voulez sélectionner plus de juste un rowid, vous devez SELECT d'une JOIN entre les tables qui vous intéressent. SQLite ne pas l'ensemble des fonctionnalités standard JOIN, vous Je vais devoir retravailler votre requête pour pouvoir utiliser un LEFT OUTER JOIN.

SELECT table1.rowid, table1.other_field 
FROM table3 
    LEFT OUTER JOIN table1 ON table3.table1_id = table1.rowid 
ORDER BY RANDOM() 
LIMIT 1; 
Questions connexes