J'ai deux tableaux A et B Colonne commune x
SELECT A.* FROM A LEFT JOIN B ON A.x == B.x WHERE A.z == "Hola" AND B.y IS NOT NULL;
Je ne sais pas quelle sortie cela produirait par rapport à EXIST ou une clause LEFT JOIN WHERE est nulle.
Si je ne me trompe pas, cela prend ce qui est sur A et commun entre A&B, mais en excluant ce que B est nul, correct?
4 Réponses :
Si la table contient les valeurs suivantes:
ID Table1_Values 1 100 2 200 3 300 4 400 5 500 null 2000
Votre requête renverra ce qui suit:
avec: A.Id, A.table1_values, B.Table2_values
ID Table1_Values Table2_Values 1 100 10 2 200 20 3 300 30 4 400 40 5 500 null
Sortie finale pour a.*:
**Table1** **Table2** ID Values ID Values 1 100 1 10 2 200 2 20 3 300 3 30 4 400 4 40 null 2000 null 3000 5 500
Données copiées à partir d'ici: jointure externe gauche avec des valeurs nulles
p >
Merci pour la réponse, que voulez-vous dire de la sortie finale pour un. *?
@Vesper C'est la requête que vous avez postée: SELECT A. *
Question très simple mais bonne.
Faisons des transformations et trouvons la réponse
WHERE sur By vers JOIN -clause SELECT A.*
FROM A
JOIN B ON A.x == B.x
AND B.y IS NOT NULL
WHERE
A.z == "Hola"
UNION ALL
SELECT A.*
FROM A
WHERE
A.z == "Hola"
AND NOT EXISTS(
SELECT * FROM B
WHERE A.x = B.x
AND B.y IS NOT NULL
)
Nous pouvons maintenant:
LEFT JOIN en UNION ALL d'expressions JOIN- et NOT EXISTS- LEFT JOIN -> JOIN + NOT EXISTS SELECT
A.*
FROM
A
LEFT JOIN B ON A.x == B.x
AND B.y IS NOT NULL
WHERE
A.z == "Hola";
vous pouvez essayer quelque chose comme ceci:
select a.*
from a
where a.z = "Hola"
and exists (select 1
from b
where b.y is not null
and b.x = a.x);
Voici votre requête:
SELECT A.*
FROM A
WHERE A.z = 'Hola' AND
EXISTS (SELECT 1 FROM B WHERE A.x = B.x AND B.y IS NOT NULL);
Vous devez décomposer la requête.
L'ensemble de résultats n'aura que AZ = 'Hola' code >. C'est un filtre important dans la clause WHERE .
Ensuite, By IS NOT NULL signifie deux choses: à la fois que la correspondance existe dans B et que y n'est pas NULL . Donc, cette requête équivaut à:
SELECT A.*
FROM A INNER JOIN
B
ON A.x = B.x
WHERE A.z = 'Hola' AND B.y IS NOT NULL;
Avec une jointure interne, vous pouvez mettre les conditions WHERE dans le code ON >. C'est une question de style. Vous ne pouvez pas faire cela avec un LEFT JOIN .
Ensuite, la requête EXISTS "équivalente" serait:
SELECT A.*
FROM A LEFT JOIN
B
ON A.x = B.x
WHERE A.z = 'Hola' AND B.y IS NOT NULL;
Merci Gordon pour l'explication! Que faire si dans les cas où B est commun à A, je souhaite attribuer des valeurs de colonne B spécifiques aux valeurs de colonne A (Exemple: pour remplir un contenu vide dans A). Cette approche fonctionnerait-elle encore? Je voudrais mentionner les doublons en A comme vous le mentionnez.
@Vesper. . . Les nouvelles questions doivent être posées sous forme de questions et non de commentaires. Cette question concerne clairement select et non `update.
C'est comme une jointure interne basée sur votre condition where pour exclure les valeurs nulles B.
Si la valeur B n'est pas nulle, je pense que ce serait au moins commun avec la table A