2010-03-12 5 views
1

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

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

Вот образцы того, что работает, если хранить их: «Как я пишу Query3 так, что он не относится к Query1 или 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)); 

Итак, мой вопрос или, я пропустил какой-то другой способ сделать это?

Благодаря, Пит [email protected]

+0

Использование Query1 и Query2 в качестве таблицы подзапросов не работает? ie: SELECT * FROM (SELECT * FROM table1) t1 JOIN (SELECT * FROM table2) t2 ИСПОЛЬЗОВАНИЕ (id) – Tarka

+0

Спасибо, Slokun, но нет: по крайней мере, я не могу заставить объединения работать. –

+0

Не могли бы вы дать нам определения таблиц (или примеры) и объяснить, что именно вы хотите в наборе результатов? – incarnate

ответ

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) 
       ) 
+0

Спасибо, Джон. Все ваши предположения верны - проблема в том, что tblOrders не содержит ProductID, мне нужно ПРИСОЕДИНЯТЬСЯ к tblOrderItems здесь. –

+0

oops. неверно получил таблицу в предложении exists. Думаю, теперь я это исправил. – JohnFx

+0

John: Извините, но я все еще смущен. Что это: SELECT * FROM tblOrderItems TOI ГДЕ (НЕ TOI.ProductID между 12 и 15) (TOI.OrderID = tblOrders.OrderID) Не следует, что часть будет в состоянии стоять вместе? Я чувствую, что у меня отсутствует ключевое слово между ними) (если вы знаете, что я имею в виду. Не нужно ли там туда присоединяться? Еще раз спасибо Pete –

0

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

 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; 
Смежные вопросы