Нужна помощь с подзапросом SQL - PullRequest
1 голос
/ 12 марта 2010

Я пытаюсь написать запрос, который вернет все заказы, в которые включена только подписка.Достаточно просто написать запрос, который включает все заказы с подписками, другой, который включает все заказы без подписки, а затем сравнить их с непревзойденным запросом.

Но я не хочу хранить запросы вмоя база данных Access, я предпочитаю, чтобы все это было в моем коде ASP, и я не могу заставить это работать только с одним сложным запросом.

Вот примеры того, что работает, если я храню их:

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));

Итак, мой вопрос: «Как мне написать Query3, чтобы он не ссылался на Query1 или Query2?»или я пропускаю какой-то другой способ сделать это?

Спасибо, Пит peteaugello@verizon.net

Ответы [ 2 ]

2 голосов
/ 12 марта 2010

Допущения

  • ProductID от 12 до 15 относится к подписки.
  • Вы ищете все заказы с только подписки и никаких других виды продукции.

Как насчет этого:

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 голосов
/ 13 марта 2010

Если вы не хотите беспокоиться о соединении, вот способ сделать это с помощью сводной таблицы.

     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;
...