2010-03-12 6 views
1

J'essaye d'écrire une requête qui retournera toutes les commandes qui ont seulement un abonnement inclus. Il est assez facile d'écrire une requête qui inclut toutes les commandes avec abonnements, une autre qui inclut toutes les commandes sans abonnement, puis de les comparer avec une requête sans correspondance.Besoin d'aide avec la sous-requête SQL

Mais je ne veux pas avoir à stocker des requêtes dans ma base de données Access, je préfère tout avoir dans mon code ASP, et je ne peux pas obtenir cela pour travailler avec une seule requête complexe.

Voici des échantillons de ce qui fonctionne si je les stocker: « Comment puis-je écrire pour qu'il Requête 3 ne se réfère pas à Query1 ou Query2 »

Query1 

SELECT tblOrders.OrderID, tblOrderItems.ProductID 
FROM tblOrders INNER JOIN tblOrderItems ON tblOrders.OrderID = tblOrderItems.OrderID 
WHERE ((Not ((tblOrderItems.ProductID)>=12 And (tblOrderItems.ProductID)<=15))); 

Query2 

SELECT tblOrders.OrderID, tblOrderItems.ProductID 
FROM tblOrders INNER JOIN tblOrderItems ON tblOrders.OrderID = tblOrderItems.OrderID 
WHERE ((((tblOrderItems.ProductID)>=12 And (tblOrderItems.ProductID)<=15))); 

Query3 

SELECT Query2.OrderID, Query2.ProductID 
FROM Query2 LEFT JOIN Query1 ON Query2.OrderID = Query1.OrderID 
WHERE (((Query1.OrderID) Is Null)); 

Alors, ma question est ou, est-ce qu'il me manque un autre moyen de le faire?

Merci, Pete [email protected]

+0

L'utilisation de Query1 et Query2 comme table de sous-requête ne fonctionne pas? SELECT * FROM (SELECT * FROM table1) t1 JOIN (SELECT * FROM table2) t2 USING (id) – Tarka

+0

Merci, Slokun, mais non: au moins, je ne peux pas faire fonctionner les jointures. –

+0

Pouvez-vous s'il vous plaît nous donner des définitions de table (ou des exemples) et expliquer ce que vous voulez exactement dans le jeu de résultats? – incarnate

Répondre

2

hypothèses

  • ProductID entre 12 et 15 fait référence à abonnements.
  • Vous êtes à la recherche de toutes les commandes avec seulement les abonnements et aucun autre type de produit .

Que diriez-vous quelque chose comme ceci:

SELECT O.OrderID, TOI.ProductID 
FROM tblOrders O 
     INNER JOIN tblOrderItems TOI ON (O.OrderID = TOI.OrderID) 
WHERE (TOI.ProductID between 12 and 15) AND 
     NOT EXISTS (SELECT * 
        FROM tblOrderItems TOI2 
        WHERE (NOT TOI2.ProductID between 12 and 15) AND 
         (TOI2.OrderID=O.OrderID) 
       ) 
+0

Merci, John. Toutes vos suppositions sont correctes - le problème est que tblOrders ne contient pas de ProductID, j'ai besoin de JOIN pour tblOrderItems ici. –

+0

oups. eu la table dans la clause exists. Je pense que je l'ai réparé maintenant. – JohnFx

+0

John: Désolé, mais je suis toujours confus. Qu'est-ce que ceci: SELECT * DE TOI tblOrderItems OU (PAS TOI.ProductID entre 12 et 15) (TOI.OrderID = tblOrders.OrderID) Si cette partie ne pouvoir tenir le long? Je sens qu'il manque un mot-clé entre le) (si vous savez ce que je veux dire.) Pete –

0

Si vous ne voulez pas vous soucier d'avoir une jointure, voici une façon de le faire avec un tableau croisé dynamique.

 select OrderID, 
    sum(case productID between 12 and 15 then 1 else 0 end) HAS_SUBSCRIPTION, 
    sum(case productID between 12 and 15 then 0 else 1 end) HAS_OTHER 
    FROM tblOrderItems 
    GROUP BY OrderID 
    HAVING HAS_SUBSCRIPTION > 0 and HAS_OTHER = 0;