2010-11-05 6 views
1

Nous avons une facture, un détail de facture et une table de commande et les tables sont liées par les lignes détail de la facture parce que les détails de la facture sont regroupés par date de livraison. numéros de commande.Inclure sous-select seulement s'il y a un résultat avec tsql

Maintenant, je voudrais construire une vue qui afficherait le numéro de commande s'il n'y a qu'un seul ordre impliqué dans la facture en utilisant un sous-type quelconque.

je suis venu avec celui-ci, mais il génère toujours une erreur signalant que le retour de sous-requête plus d'un résultat

SELECT Invoice.Id, Invoice.TotalAmount, 
(SELECT DISTINCT OrderId FROM InvoiceDetail 
WHERE InvoiceDetail.InvoiceId = Invoice.Id 
GROUP BY OrderId HAVING COUNT(DISTICT OrderId) = 1) AS OrderId 
FROM Invoice 

Toutes les idées pour que cela fonctionne?

Répondre

1

Que diriez-vous:

SELECT 
    Invoice.Id, 
    Invoice.TotalAmount, 
    OneOrder.OrderId 
FROM 
    Invoice 
    LEFT JOIN (
    SELECT InvoiceId, MIN(OrderId) OrderId 
    FROM  InvoiceDetail 
    GROUP BY InvoiceId 
    HAVING COUNT(DISTINCT OrderId) = 1 
) OneOrder ON OneOrder.InvoiceId = Invoice.Id 
+0

Mettre l'OrderId dans un agrégat travaillé parce que le orderid peut être omis dans la clause de groupement. L'utilisation d'une jointure externe gauche l'a fait inclure toutes les factures avec une valeur nulle pour la commande pour facturée avec plusieurs commandes. – jhoefnagels

1

Testée correcte:

SELECT Id, TotalAmount, OrderInfo.OrderId 
    FROM Invoice 
    JOIN 
    (
     SELECT InvoiceId, OrderId 
     FROM InvoiceDetail 
     JOIN Invoice 
      ON InvoiceDetail.InvoiceId = Invoice.Id 
     GROUP BY InvoiceId, OrderId 
     HAVING COUNT(OrderId)=1 
    ) AS OrderInfo 
    ON Invoice.Id=OrderInfo.InvoiceId 

Avis manque de DISTINCT dans la clause HAVING, ce qui est incorrect (il causerait plusieurs ids de commande pour compter comme l'un, brisant le comportement attendu)

+0

Fixer la faute de frappe du code original: '' DISTICT' devrait être DISTINCT' – JNK

+0

THX, je l'ai fixé ... –

+0

'GROUP BY InvoiceID, OrderId' est garanti * * pour remplir 'COMPTER HOMME (OrderId) = 1' - mais ce n'est pas ce que le PO a demandé, à mon humble avis. – Tomalak

0

Votre problème peut être la faute de frappe dans la clause HAVING. Voir DISTICT.

0

changement GROUP BY OrderId à GROUP BY InvoiceDetail.InvoiceId