SQLite JOINTURE GAUCHE & Clause where de la confusion
J'ai deux Tables:
Tableau 1: Questions:
QuestionId NUMERIC
Title TEXT
Des Données de Test dans la Table Question:
QuestionId Title
1 What is your name?
2 What is your age?
Tableau 2: Réponses:
AnswerId NUMERIC
PersonId NUMERIC
QuestionId NUMERIC
Answer TEXT
Si il y a PAS de DONNÉES dans les Réponses de la Table puis ci-dessous requête renvoie des résultats corrects (2 lignes):
SELECT q.QuestionId, q.Title, a.Answer
FROM Questions q
LEFT OUTER JOIN Answers a ON q.QuestionId = a.QuestionId
WHERE a.PersonId = 2 OR a.PersonId IS null
Mais si j'ai par exemple 1 enregistrement dans la Table de Réponse comme:
AnswerId 1
PersonId 1
QuestionId 1
Answer 'My Name is Yaqub'
Ci-dessous requête fonctionne très bien:
SELECT q.QuestionId, q.Title, a.Answer
FROM Questions q
LEFT OUTER JOIN Answers a ON q.QuestionId = a.QuestionId
WHERE a.PersonId = 1 OR a.PersonId IS null
Mais cette requête renvoie seulement une ligne:
SELECT q.QuestionId, q.Title, a.Answer
FROM Questions q
LEFT OUTER JOIN Answers a ON q.QuestionId = a.QuestionId
WHERE a.PersonId = 2 OR a.PersonId IS null
La requête ci-dessus renvoie juste une ligne qui est mal, parce que j'ai deux questions à la Question de la Table & à la requête ci-dessus doit retourner les deux d'entre eux en raison de l'état " OU un.PersonId EST nulle".
Pourquoi pas le retour de DEUX Lignes?
Résultats Souhaités:
Je veux recevoir toutes les questions(2 lignes) & ces réponses où PersonId a une certaine valeur,par exemple DEUX lignes pour la Personne 2 parce que je n'ai pas de données dans la Table de Réponse.
Je ne suis pas le downvoter, mais votre question n'est pas très claire.
OriginalL'auteur Yaqub Ahmad | 2012-06-27
Vous devez vous connecter pour publier un commentaire.
J'ai TROUVÉ la SOLUTION:
Cette requête affichera la liste de toutes les questions & la clause where va filtrer les réponses où PersonID a une valeur spécifique ou la valeur null. Donc, chaque fois qu'il y a une réponse à une question, je vais l'avoir pas de valeurs NULL pour PersonID.
where
clause?Désolé pour la réponse tardive, j'ai été bussy!! Je ne peux pas exclure la Clause where parce que j'ai besoin de montrer les questions par personne & les réponses si elles existent pour cette personne.
La clause where va filtrer les réponses où PersonID a une valeur spécifique ou la valeur null. Donc, chaque fois qu'il y a une réponse à une question, je vais l'avoir pas de valeurs NULL pour PersonID
super! ma version de SQLite ne pas accepter l'EXTÉRIEUR, mais à côté de cela, vous avez résolu mon problème. UPVOTED
Exactement ce que je cherchais...Upvoted!
OriginalL'auteur Yaqub Ahmad
Vous pouvez le faire comme ceci:
La requête renvoie toujours enregistrements avec PersonId = null en raison de la jointure externe.
OriginalL'auteur Pedro Velha
C'est ce que vous avez lorsque vous effectuez les rejoindre, avant la
where
est appliquée:Il y a en fait qu'un seul enregistrement dans les questions de la table qui correspond à
(PersonID = 2 or PersonID is null)
, de sorte que vous devriez vous attendre une seule ligne.Avez-vous moyen de mettre les
à la place?
Ce Blorgbeard essaie de dire, c'est que votre
where
clause de filtres de la deuxième rangée. Si vous ne spécifiez paswhere PersonId is null
, alors la requête retourne deux lignes.En fait j'ai besoin d'obtenir les questions pour différentes personnes, donc ma Clause where peut être un.PersonId = 1, un.PersonId = 1 & ainsi de suite. Veuillez vérifier ma question encore une fois.
J'ai un.PersonId EST nulle, de sorte qu'il devrait retourner à la fois les lignes.
Encore une fois, vous êtes le filtrage de la deuxième rangée en exigeant
PersonID
être null. Si vous souhaitez que deux lignes, alors ne faites pas cette restriction. C'est aussi simple que cela.OriginalL'auteur Blorgbeard
@Yaqub. Si vous voulez montrer à tous la question à partir de là je pense que vous devez appliquer le DROIT de la JOINTURE EXTERNE pour remplacer la Jointure Externe Gauche de sorte qu'il prendra toutes les questions. grâce
DROIT de JOINDRE n'est pas disponible sqlite.org/omitted.html
Puis changer l'ordre des tables dans lesquelles vous êtes à la rejoindre. Sheesh!
OriginalL'auteur Muhammad Iftikhar