2017-09-19 5 views
0

EDIT (RESOLU): Une jointure croisée. Une de ces jointures que vous n'utilisez jamais jusqu'à ce que vous en ayez besoin. Merci pour l'aideJointure à gauche d'une table où les valeurs n'existent pas (et ne sont pas des valeurs NULL)

Table gauche: TS, champ unique avec des valeurs [1,2, ..., 365].

Table droit: PAIEMENT avec trois champs (ID, TS, AMT)

Pour chaque ID, je veux voir 365 enregistrements d'une jointure gauche de TS sur le paiement.

Le problème est que "aucune valeur" n'est identique à une valeur nulle.

Si PAYMENT.TS n'existe pas pour une certaine valeur (par exemple PAYMENT.TS = 4), il n'y a pas de valeur à joindre et la jointure à gauche ne renvoie pas de ligne # 4.

J'ai essayé d'utiliser NOT IN/NOT EXISTS comme condition, mais cela ne traite que le cas où la table de droite a explicitement NULLS et non le cas où aucune valeur n'existe.

Comment procéder? Merci!

(Ceci est un système de DB2)


SELECT * FROM TS LEFT JOIN PAYMENT ON TS = PAYMENT.TS 

TS TABLEAU:

| TS | 
---------- 
    1   
    2  
    ...   
    365  

PAIEMENTS TABLEAU:

| ID | TS | PMT | 
----------------------------- 
    1  1   70  
    1  2   20 
    1  5   10 
    2  3   200 

RÉSULTAT PRÉVU:

| ID | TS | PMT | 
----------------------------- 
    1  1   70 
    1  2   20 
    1  3   
    1  4   
    1  5   10 
    ...  ... 
    1  365 

    2  1 
    2  2 
    2  3   200  
    ...  ... 
    2  365 

RÉSULTAT RÉEL:

| ID | TS | PMT | 
----------------------------- 
    1  1   70 
    1  2   20 
    1  5   10 
    2  3   200  
+0

Ajoutez un exemple de tableau et le résultat attendu. (Comme le texte formaté, pas les images.) – jarlh

+0

Votre description de «aucune valeur» à se joindre n'a pas de sens; une jointure gauche _must_ renvoie tous les enregistrements du côté gauche de la jointure (parfois plus que cela, si la jointure a été réussie). –

+0

@TimBiegeleisen J'ai ajouté un exemple de tableau, pour clarifier la question. THX! – AIS700

Répondre

0

Vous devez générer toutes les lignes que vous voulez à l'aide d'un cross join puis utilisez left join:

SELECT i.id, ts.ts. p.amt 
FROM (SELECT DISTINCT ID FROM PAYMENT) i CROSS JOIN 
    TS LEFT JOIN 
    PAYMENT p 
    ON ts.TS = p.TS AND p.id = i.id; 

Ceci renvoie 365 lignes pour chaque id.

0

Vous devez les rejoindre correspondre les deux colonnes communes dans chaque tableau. De préférence par les touches (étrangères et primaires). Supposons que la table TS ait cette colonne appelée 'NUMBERS' et que son type soit int. La table PAYMENT a l'ID de la colonne, le type de int aussi. Ce qui signifie qu'ils peuvent avoir des valeurs communes. Ainsi, si vous voulez joindre deux tables et obtenir les communes où le PAYMENT.ID existe dans TS.NUMBERS alors vous devriez faire:

SELECT * FROM TS LEFT JOIN PAYMENT ON TS.NUMBERS = PAYMENT.ID 

J'espère que je suis clair. Remarque: N'oubliez pas non plus que si une colonne ou plus a le même nom dans les deux tables, vous devez préciser à partir de quelle table vous voulez cette colonne par exemple si la table PAYMENT a aussi la colonne NUMBERS, alors: CHOISISSEZ PAYMENT.ID, TS.NUMBERS FROM TS GAUCHE PAYER LE PAIEMENT SUR TS.NUMBERS = PAIEMENT.

ID