Нужна помощь с подзапросом SQL

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

Но я не хочу хранить запросы в своей базе данных 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?» или мне не хватает другого способа сделать это?

Спасибо, Пит [email protected]


person Pete Augello    schedule 12.03.2010    source источник
comment
Использование Query1 и Query2 в качестве таблицы подзапросов не работает? то есть: SELECT * FROM (SELECT * FROM table1) t1 JOIN (SELECT * FROM table2) t2 USING (id)   -  person Tarka    schedule 12.03.2010
comment
Спасибо, Slokun, но нет: по крайней мере, я не могу заставить работать соединения.   -  person Pete Augello    schedule 12.03.2010
comment
Не могли бы вы дать нам определения таблиц (или примеры) и объяснить, что именно вы хотите получить в наборе результатов?   -  person BorisOkunskiy    schedule 12.03.2010
comment
Я буду рад предоставить полную информацию, если вы действительно этого хотите, но вкратце: у меня есть tblProducts для моих, ну, продуктов; tblOrders — одна запись для каждого заказа — и tblOrderItems с записью для каждой позиции в заказе. tblOrderItems имеет идентификаторы OrderID и ProductID, а INNER JOIN дает мне все продукты для заказа. Некоторые из моих продуктов являются подписками, которые поставляются отдельно. Мне нужно найти заказы, на которые есть ТОЛЬКО подписки и ничего больше, чтобы я мог пометить их как отправленные. Если вам нужно больше, пожалуйста, просто дайте мне знать. Спасибо за вашу помощь!   -  person Pete Augello    schedule 13.03.2010


Ответы (2)


Предположения

  • 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)
                 )
person JohnFx    schedule 12.03.2010
comment
Спасибо, Джон. Все ваши предположения верны - проблема в том, что tblOrders не содержит ProductID, здесь мне нужно ПРИСОЕДИНИТЬСЯ к tblOrderItems. - person Pete Augello; 13.03.2010
comment
ой. ошибся в таблице в предложении exists. Думаю, теперь я это исправил. - person JohnFx; 13.03.2010
comment
Джон: Извините, но я все еще в замешательстве. Что это: SELECT * FROM tblOrderItems TOI WHERE (НЕ TOI.ProductID между 12 и 15) (TOI.OrderID=tblOrders.OrderID) Разве эта часть не должна оставаться в силе? Я чувствую ссылку, в которой отсутствует ключевое слово между )( если вы понимаете, что я имею в виду. Разве там не должно быть JOIN? Еще раз спасибо. Пит - person Pete Augello; 13.03.2010
comment
Джон -- вот оно! Я думаю, у меня были проблемы с предложениями AS (и я вижу, что вы пропустили это ключевое слово - я не знал, что вы можете это сделать!) Спасибо за всю вашу помощь. - person Pete Augello; 13.03.2010
comment
Голосование или принятие моего ответа - это все, что требуется от благодарности. знак равно - person JohnFx; 13.03.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;
person Ryan Goltry    schedule 13.03.2010