1
votes

JOINT GAUCHE O Cl LA Clause N'EST PAS NULL

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?

sql

2 commentaires

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


4 Réponses :


1
votes

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 >


2 commentaires

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. *



0
votes

Question très simple mais bonne.

Faisons des transformations et trouvons la réponse

Étape 1: Déplacez le prédicat 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:

  1. Transformez LEFT JOIN en UNION ALL d'expressions JOIN- et NOT EXISTS-

Étape 2: Transformation 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";


0 commentaires

0
votes

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);


0 commentaires

1
votes

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;


2 commentaires

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.