Je veux un rapport avec les marques qui n'ont aucune vente pour une période spécifique. Voici ce que j'ai essayé jusqu'à présent, mais je reçois une colonne vide brand_name code>. SELECT DISTINCT
Brands$.BRAND_NAME
FROM
Brands$
INNER JOIN
Products$ ON Brands$.BRAND_ID = Products$.BRAND_ID
LEFT JOIN
InvDetails$ ON Products$.PRODUCT_ID = InvDetails$.PRODUCT_ID
INNER JOIN
Invoices$ ON Invoices$.INVOICE_ID = InvDetails$.INVOICE_ID
WHERE
InvDetails$.PRODUCT_ID IS NULL
AND (Invoices$.INVOICE_DATE BETWEEN '2013-10-22 23:41:49.143'
AND '2013-11-22 17:54:03.437')
6 Réponses :
Vous devez déplacer la condition de la table de jointure gauche sur la clause si vous utilisez où vous utilisez la colonne liée à la table de jointure gauche, ouvrez-la comme une jointure interne p> p> p> P> P> P> P> P> P> P> P> >
Je pense que vous avez juste besoin de deux table Les alias rendent la requête plus facile à écrire et à lire. P> p> rejoindre code> s et pour déplacer la condition sur les factures vers la clause code> sur code>;
avec ceci:
SELECT Brands$.BRAND_NAME FROM Brands$ EXCEPT SELECT DISTINCT Brands$.BRAND_NAME FROM Brands$ INNER JOIN Products$ ON Brands$.BRAND_ID = Products$.BRAND_ID INNER JOIN InvDetails$ ON Products$.PRODUCT_ID = InvDetails$.PRODUCT_ID INNER JOIN Invoices$ ON Invoices$.INVOICE_ID = InvDetails$.INVOICE_ID WHERE Invoices$.INVOICE_DATE BETWEEN '2013-10-22 23:41:49.143' AND '2013-11-22
Lorsque vous essayez de trouver des enregistrements d'une table sans enregistrements correspondants dans une autre table (s), n'existe pas code> fonctionnera mieux sur SQL Server que , en outre, je trouve que cela transmet une intention beaucoup plus clairement, par exemple JOIN \ est null code >
SELECT b.BRAND_NAME
FROM Brands$ AS b
WHERE NOT EXISTS
( SELECT 1
FROM Products$ AS p
INNER JOIN InvDetails$ AS id
ON id.PRODUCT_ID = p.PRODUCT_ID
INNER JOIN Invoices$ AS i
ON i.INVOICE_ID = id.INVOICE_ID
WHERE i.INVOICE_DATE BETWEEN '2013-10-22 23:41:49.143' AND '2013-11-22 17:54:03.437'
WHERE p.BRAND_ID = b.BRAND_ID
);
J'utilise n'existe pas pour exclure les marques avec des factures pour la période donnée
SELECT DISTINCT b.BRAND_NAME
FROM Brands$ b
INNER JOIN Products$ p ON b.BRAND_ID=p.BRAND_ID
WHERE NOT EXISTS(SELECT 1
FROM Invoices$ i
JOIN InvDetails$ id ON i.INVOICE_ID = id.INVOICE_ID
WHERE i.INVOICE_DATE BETWEEN '2013-10-22 23:41:49.143' AND '2013-11-22 17:54:03.437'
AND id.PRODUCT_ID = p.PRODUCT_ID)
Trouvez des marques avec facture et excluez. au lieu de la marque, un identifiant numérique doit être plus rapide à comparer. p> p>
mettre à jour un échantillon de données approprié et le résultat attendu
commentaire où les clauses de voir quelle est la cause, faites la même chose avec des jointures si aucune joie.