0
votes

Rejoindre extérieur gauche PostgreSQL

J'ai la table Invoice_Items: xxx pré>

puis la facture de la table: p> xxx pré>

données sur la table Invoice_Items: P>

SELECT b.type, b.invoice_id, i.kb_invoice, b.current_balance, b.external_key, b.created_date, i.trx
from invoice_items b 
  left outer join invoice i ON b.invoice_id = i.kb_invoice 
where b.external_key='MT80' 
  and b.tenant_record_id='7'


4 commentaires

Vous souhaitez donc rechercher toutes les factures-items avec external_key 'mt80', où aucune facture ne peut être trouvée?


Les deux éléments de facturation ont la même facture_id si évidemment les matchs de jointure gauche pour les deux rangées. Si vous aviez utilisé une jointure intérieure, vous obtiendrez le même résultat (et les deux lignes ont le même tenant_record_id et external_key). Laquelle des deux rangées attendriez-vous à être retournée?


Oui, obtenir de la valeur juste sur la facture n'existe pas, mais dans Invoice_items existe @Aschoerk


Voir ma réponse, cela devrait fonctionner


4 Réponses :


0
votes

Dans votre violon, vous n'avez pas de kb_invoce avec NULL VALEUR afin que votre requête ne renvoie pas de lignes .. Vous avez besoin d'une valeur NULL appropriée pour Invoce KB_INVOICE

INSERT INTO invoice
("kb_invoice",
  "trx",
"id_invoice",
 "uid_invoice",
"datetime",
"cur_balance",
"description",
"eeuser",
"external_key",
"tenant",
"document",
"sms",
"amount")
VALUES
(null,'2','3012577', null,'2019-12-18 18:46:57.048000','957',null,'1236165','MT80','2078698','2',null,'1'
);


1 commentaires

Je pense que vous avez mal compris ce que OP essaie de faire. Il cherche orphelined invoice_items , mais dans son exemple, les deux enregistrements de cette table ont un enregistrement correspondant dans facture , donc il renvoie 0 enregistrements. Il n'y a pas besoin de valeur nulle dans cette colonne, il doit simplement modifier légèrement la valeur clé dans l'une des tables. NULL se qualifie, mais n'est pas la seule possibilité comme vous impliquer.



0
votes

essayer

SELECT * de ( SELECT b b. "external_key", b. "créé_date", i. "trx" de solvoice_items b Rejoignez la facture de la facture i sur b. "Invoice_id" = i. "kb_invoice" où b. "external_key" = 'mt80' et b. "tenant_record_id" = '7' ) comme x où x. "A" est null;


4 commentaires

Il n'est pas possible d'utiliser le nom d'alias de colonne dans l'endroit où / ON Clause. Pas dans PostgreSQL.


Alors utilisez l'extrême gauche rejoindre le résultat temporaire


Je l'ai essayé, mais le résultat si on existe sur 2, il n'existe pas de spectacle, il ne doit pas montrer la deuxième ligne et la troisième rangée ne devrait pas être montrant, aucun conseil? et avec vous exemple, le résultat est vide @Aschoerk dbfiddle.uk/...


Votre testData ne contient pas de facture_Items orphelins. Par conséquent, la déclaration ne renvoie aucun enregistrement. Ai-je bien compris vos intentions?



0
votes

Si je comprends votre question correctement, vous souhaitez trouver des objets de facturation où il n'y a pas de ligne de facture correspondante.

Votre requête a l'air bien, mais vos échantillons de données ne transmettent pas le scénario que vous dites que vous recherchez.

Si vous modifiez votre exemple de données invoice_id pour référencer une facture inexistante (j'ai utilisé bb963c3a-6fdb-47df-b3d9-00000000000000 ), vous Voir que votre requête fonctionne, selon cette Fiddle mis à jour . La ligne ORPHANED FIVOICE_ITEM est renvoyée, avec des données NULL dans le parent qui a été EXTÉRIEUR EXTÉRIEUR JOINT JOINT . (Vous avez peut-être eu envie d'utiliser b.trx dans vos colonnes SELECT, c'est-à-dire désactivé invoice_items , car facture.trx sera toujours null) .

Cependant, il est assez inhabituel d'avoir une relation parent-enfant non référentielle appliquée, permettant d'insertion d'éléments enfants ( élément de facturation ) sans un parent associé ( facture ) rangée. Cela sera sujet aux lignes orphelines (selon votre requête).


0 commentaires

0
votes

Ce problème a été le succès de cette solution, sur la clause ON où ajoutez trx = 3 car trx = 3 est manquant sur la facture de la table, mais la même facture Invoice_id existe sur les deux table: xxx

Solution


0 commentaires