【问题标题】:Access nested joins with multiple where's possible?访问具有多个可能的嵌套连接?
【发布时间】:2016-04-06 23:40:35
【问题描述】:

我有这个接近我想要的 SQL 语句:

SELECT CustomerList.*, Sales.Sales, Sales.MonthYear
FROM (CustomerList INNER JOIN WhoBuysWhat ON CustomerList.CustomerID = WhoBuysWhat.CustomerID) LEFT JOIN Sales ON CustomerList.CustomerID = Sales.CustomerID
WHERE WhoBuysWhat.ProductID=2
ORDER BY CustomerList.CustomerName;

这为我提供了购买某个产品线的所有客户以及该产品线的销售表中的任何销售额。但我想要的是添加另一个 WHERE 语句。我希望第一个 INNER JOIN 给我所有购买 productID 2 的客户。然后我想左加入那些匹配 sales.monthyear=#1/1/2015# 的销售。所以我尝试了这个(以不同的方式):

SELECT CustomerList.*, Sales.Sales, Sales.MonthYear
FROM ((CustomerList INNER JOIN WhoBuysWhat ON CustomerList.CustomerID = WhoBuysWhat.CustomerID) WHERE WhoBuysWhat.ProductID=2) LEFT JOIN Sales ON CustomerList.CustomerID = Sales.CustomerID
WHERE Sales.MonthYear=#1/1/2015#
ORDER BY CustomerList.CustomerName;

那是行不通的。如果我这样做:

WHERE WhoBuysWhat.ProductID=2 AND Sales.MonthYear=#1/1/2015#

WHERE Sales.ProductID=2 AND Sales.MonthYear=#1/1/2015#

它只给我当月有销售的客户。我希望所有购买该产品线的客户在给定的一个月内进行任何销售。这可能在 1 个 SQL 语句中吗?我需要对第一个连接表使用 AS 吗?我找不到任何可以帮助我的东西。

J_K_M_A_N

编辑: 如果以后有人关心或需要帮助,这是最后的有效 SQL 语句。

SELECT CustomerList.*, Sales.SalesID, Sales.Sales, WhoBuysWhat.EntryID, WhoBuysWhat.Active
FROM (CustomerList INNER JOIN WhoBuysWhat ON CustomerList.CustomerID = WhoBuysWhat.CustomerID)
LEFT JOIN Sales ON (CustomerList.CustomerID = Sales.CustomerID AND Sales.MonthYear=#1/1/2015# AND Sales.ProductID=2)
WHERE WhoBuysWhat.ProductID=2
ORDER BY WhoBuysWhat.Active, CustomerList.CustomerName

【问题讨论】:

    标签: sql ms-access join


    【解决方案1】:

    当您使用LEFT OUTER JOIN 并且想要从Right 表中过滤一些记录时,您需要将右表filter 移动到ON 条件否则@ 987654323@ 将隐式转换为INNER JOIN

    简而言之,WHERE 子句reject 带有NULL 的行,这些行由LEFT OUTER JOIN 生成,用于不匹配的记录

    SELECT customerlist.*, 
           sales.sales, 
           sales.monthyear 
    FROM   (customerlist 
            INNER JOIN whobuyswhat 
                    ON customerlist.customerid = whobuyswhat.customerid) 
           LEFT JOIN sales 
                  ON (customerlist.customerid = sales.customerid 
                     AND sales.monthyear = #1/1/2015#) 
    WHERE WhoBuysWhat.ProductID=2
    ORDER  BY customerlist.customername; 
    

    【讨论】:

    • 我试过了,我得到的只是“不支持加入表达式”。我在访问该数据库的 Access 2000(旧的,我知道)和 VB Net 中都尝试了它。两者都给出了相同的错误。它不适用于那么旧的版本吗?在第二次加入的 AND 之后,它似乎不喜欢任何东西。
    • 我通过在 ON AND 部分周围使用 () 使其工作。所以现在我有了这个:SELECT CustomerList.*, Sales.SalesID, Sales.Sales, Sales.MonthYear FROM (CustomerList INNER JOIN WhoBuysWhat ON CustomerList.CustomerID = WhoBuysWhat.CustomerID) LEFT JOIN Sales ON (CustomerList.CustomerID = Sales.CustomerID AND Sales.MonthYear=#1/1/2015#) WHERE WhoBuysWhat.ProductID=2 ORDER BY CustomerList.CustomerName; 感谢您的帮助!
    • 我不得不稍微改变一下,因为只要日期正确,INNER JOIN 就匹配 Sales 中的所有内容,所以我必须添加另一个 AND 并匹配 Sales.ProductID。在将当月的任何销售与相同的 CustomerID 匹配之前,它没有到达 WHERE WhoBuysWhat.ProductID=2。现在它完美地工作了。再次感谢。
    【解决方案2】:

    我认为你可以使用子查询在 MS Access 中做你想做的事:

    SELECT cl.*, s.sales,  s.monthyear 
    FROM (customerlist as cl INNER JOIN
          whobuyswhat as wbw
          ON cl.customerid = wbw.customerid
         ) LEFT JOIN
         (SELECT s.*
          FROM sales as s
          WHERE s.monthyear = #1/1/2015#
         ) as s
         ON (cl.customerid = s.customerid 
    WHERE wbw.ProductID = 2
    ORDER BY cl.customername; 
    

    【讨论】:

      猜你喜欢
      • 2010-10-13
      • 2014-08-18
      • 2019-03-13
      • 2019-05-19
      • 2018-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多