【问题标题】:Need Help with SQL Subquery在 SQL 子查询方面需要帮助
【发布时间】:2010-03-12 20:34:28
【问题描述】:

我正在尝试编写一个查询,该查询将返回所有仅包含订阅的订单。编写一个包含所有带有订阅的订单的查询很容易,另一个包含所有没有订阅的订单,然后将它们与不匹配的查询进行比较。

但我不想将查询存储在我的 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

【问题讨论】:

  • 使用 Query1 和 Query2 作为子查询表不起作用?即:SELECT * FROM (SELECT * FROM table1) t1 JOIN (SELECT * FROM table2) t2 USING(id)
  • 谢谢,Slokun,但不行:至少我无法让连接工作。
  • 能否请您给我们表格定义(或示例)并解释您在结果集中究竟想要什么?
  • 如果您真的需要,我很乐意提供完整的详细信息,但简而言之,我的产品有 tblProducts; tblOrders -- 每个订单一个记录 -- 和 tblOrderItems 记录一个订单中的每个项目。 tblOrderItems 具有 OrderID 和 ProductID,并且 INNER JOIN 为我提供了订单的所有产品。我的一些产品是单独发货的订阅。我需要找到只有订阅而没有其他内容的订单,所以我可以将它们标记为已发货。如果您需要更多,请告诉我。感谢您的帮助!

标签: sql ms-access subquery


【解决方案1】:

假设

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

【讨论】:

  • 谢谢,约翰。你所有的假设都是正确的——问题是 tblOrders 不包含 ProductID,我需要在这里加入 tblOrderItems。
  • 哎呀。在存在子句中弄错了表。我想我现在已经修好了。
  • 约翰:对不起,我还是很困惑。这是什么: SELECT * FROM tblOrderItems TOI WHERE (NOT TOI.ProductID between 12 and 15) (TOI.OrderID=tblOrders.OrderID) 那部分不应该能站得住脚吗?我觉得链接它在 )( 之间缺少一个关键字,如果您知道我的意思。那里不需要 JOIN 吗?再次感谢。Pete
  • 约翰——就是这样!我想我在使用 AS 子句时遇到了问题(我看到你漏掉了那个关键字——我不知道你能做到这一点!)谢谢你的帮助。
  • 赞成或接受我的回答是所有需要的感谢。 =)
【解决方案2】:

如果您不想担心连接,这里有一种使用数据透视表的方法。

     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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-18
    • 1970-01-01
    相关资源
    最近更新 更多