【问题标题】:multiple joins left joins access / subquery多个连接左连接访问/子查询
【发布时间】:2016-08-22 14:10:33
【问题描述】:

以下代码在 MS Access 中运行正常。但是,我正在尝试添加进一步的左连接。我的左连接将连接查询而不是表。

希望这是有道理的。

感谢帮助

SELECT 
    a.[business unit], 
    b.[Total Colleagues in DMS], 
    Sum(IIf([a].[Session Date] Is Not Null,1,0)) AS [Total Bookings],
    Sum([a.Has Booking been cancelled (Yes / No)]) AS [Total Cancellations], 
    (Sum(IIf([a].[Session Date] Is Not Null,1,0))-Sum([a.Has Booking been cancelled (Yes / No)])) AS [Net Bookings], 
    Sum([a.lookup_attended]) AS Attended, 
    (b.[Total Colleagues in DMS]-(Sum(IIf([a].[Session Date] Is Not Null,1,0))-Sum([a.Has Booking been cancelled (Yes / No)]))) AS [Unbooked Spaces] 
FROM 
    everything AS a  
LEFT JOIN 
(
    SELECT 
        a.[business unit], count(*) AS [Total Colleagues in DMS] 
    FROM 
    (
        SELECT DISTINCT 
            a.lookup_id, 
            A.[BUSINESS UNIT] 
        FROM 
            EVERYTHING AS a 
        WHERE 
            (a.status<>"leaver" Or a.status<>"Not in scope") 
            And 
            A.PROJECT Is Null
     )  AS [%$##@_Alias] 
     GROUP BY 
         a.[business unit]
 )  AS b 
 ON 
     a.[business unit] = b.[business unit]
WHERE 
(
    ((a.status)<>"leaver" Or (a.status)<>"not in scope")    
GROUP BY 
    a.[business unit], 
    b.[Total Colleagues in DMS], 
    b.[business unit];

【问题讨论】:

  • 您在提出问题时需要提供更多信息,例如:您尝试加入的查询的名称是什么?它与列出的现有表格有何关系?添加此查询后,该联接与其他表之间的关系是什么,因为总和可能会关闭。
  • 这有什么问题?重新格式化 SQL 后,WHERE 语句中缺少 )。您只是遇到语法错误吗?您能否发布确切的错误消息(如果有)?
  • 表确实可以是查询(派生表、视图、存储的查询对象)。要加入第三张桌子,您需要将前两张放在括号中,例如SELECT * FROM (T1 JOIN T2 ON T1.id = T2.id) JOIN T3 ON T1.id = T3.id(注意优化器不需要遵守指定的顺序)。

标签: sql ms-access left-join


【解决方案1】:

您的问题不清楚,但 MS Access + additional LEFT JOIN 让我认为您的主要问题是您在查询中添加了额外的 LEFT JOIN上面没有显示,并且如果您有多个 JOIN,您没有用 MS ACCESS SQL 中所需的括号将您的表括起来。这给了你一个错误。

如果我完全错了,你最好解释一下你的问题是什么。

所以这不会工作:

SELECT 
    a.[business unit], 
    b.[Total Colleagues in DMS], 
    Sum(IIf([a].[Session Date] Is Not Null,1,0)) AS [Total Bookings],
    Sum([a.Has Booking been cancelled (Yes / No)]) AS [Total Cancellations], 
    (Sum(IIf([a].[Session Date] Is Not Null,1,0))-Sum([a.Has Booking been cancelled (Yes / No)])) AS [Net Bookings], 
    Sum([a.lookup_attended]) AS Attended, 
    (b.[Total Colleagues in DMS]-(Sum(IIf([a].[Session Date] Is Not Null,1,0))-Sum([a.Has Booking been cancelled (Yes / No)]))) AS [Unbooked Spaces] 
FROM 
    everything AS a  
LEFT JOIN 
(
    SELECT 
        a.[business unit], count(*) AS [Total Colleagues in DMS] 
    FROM 
    (
        SELECT DISTINCT 
            a.lookup_id, 
            A.[BUSINESS UNIT] 
        FROM 
            EVERYTHING AS a 
        WHERE 
            (a.status<>"leaver" Or a.status<>"Not in scope") 
            And 
            A.PROJECT Is Null
     )  AS [%$##@_Alias] 
     GROUP BY 
         a.[business unit]
 )  AS b 
 ON 
     a.[business unit] = b.[business unit]
LEFT JOIN your_query AS q ON q.whatever=a.whatever    

WHERE 
(
    ((a.status)<>"leaver" Or (a.status)<>"not in scope")    
GROUP BY 
    a.[business unit], 
    b.[Total Colleagues in DMS], 
    b.[business unit];

但这会起作用:

SELECT 
    a.[business unit], 
    b.[Total Colleagues in DMS], 
    Sum(IIf([a].[Session Date] Is Not Null,1,0)) AS [Total Bookings],
    Sum([a.Has Booking been cancelled (Yes / No)]) AS [Total Cancellations], 
    (Sum(IIf([a].[Session Date] Is Not Null,1,0))-Sum([a.Has Booking been cancelled (Yes / No)])) AS [Net Bookings], 
    Sum([a.lookup_attended]) AS Attended, 
    (b.[Total Colleagues in DMS]-(Sum(IIf([a].[Session Date] Is Not Null,1,0))-Sum([a.Has Booking been cancelled (Yes / No)]))) AS [Unbooked Spaces] 
FROM 
   (( everything AS a  
LEFT JOIN 
(
    SELECT 
        a.[business unit], count(*) AS [Total Colleagues in DMS] 
    FROM 
    (
        SELECT DISTINCT 
            a.lookup_id, 
            A.[BUSINESS UNIT] 
        FROM 
            EVERYTHING AS a 
        WHERE 
            (a.status<>"leaver" Or a.status<>"Not in scope") 
            And 
            A.PROJECT Is Null
     )  AS [%$##@_Alias] 
     GROUP BY 
         a.[business unit]
 )  AS b 
 ON 
     a.[business unit] = b.[business unit] )
LEFT JOIN your_query AS q ON q.whatever=a.whatever )

WHERE 
(
    ((a.status)<>"leaver" Or (a.status)<>"not in scope")    
GROUP BY 
    a.[business unit], 
    b.[Total Colleagues in DMS], 
    b.[business unit];

注意FROM 后的左括号和每个ON 子句后的右括号

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-02
    相关资源
    最近更新 更多