替换访问sql中的多个左连接

时间:2012-09-17 19:46:56

标签: sql ms-access

我在 ms access 中为三个表写了一个查询" Process Name"," Work_Log1"和" ACn_reviewer"。

现在" Work_Log1" table正在使用" Process NAme"和" ACN_REviewer"表。

但是" Work_log1" table在某些行中具有空值,用于" ACN_Reviewer"表

正在运作查询我想出了

select w.[activity_id], w.[activity_start_date], w.[reporting month] , 
r.[Reviewer_Name] , p.[process_name]
from [process name] p left join 
([work_log1] w left join [acn_reviewer] r
on w.[ACN Reviwer] = r.[ACN_Reviewer_ID]  )
on w.[process] = p.[process_id] 
 where w.[activity_id] = 54447 

现在我知道work_log1表中没有进程ids null。

我问的问题是,在没有连接的情况下,有哪些方法可以进行上述查询?

像这样的东西,只在acn_reviewer上加入

 select w.[activity_id], w.[activity_start_date], w.[reporting month] , 
r.[Reviewer_Name] , p.[process_name]
from [process name] p  ,   [work_log1] w left join [acn_reviewer] r
 on w.[ACN Reviwer] = r.[ACN_Reviewer_ID]   
  where w.[process] = p.[process_id] and 
  w.[activity_id] = 54447 

我希望现在我很清楚

所以我可以在sql中写这样的东西,这会在ms-access中抛出错误

select w.[activity_id], w.[activity_start_date], w.[reporting month] ,
r.[Reviewer_Name] , p.[process_name] from [process name] p, [work_log1] w 
left join [acn_reviewer] r
on w.[ACN Reviwer] = r.[ACN_Reviewer_ID]  on w.[process] = p.[process_id]
 where w.[activity_id] = 54447 ;

由于

Pradyut

2 个答案:

答案 0 :(得分:1)

从我从上面的属性中收集的内容:

Process Name (p)
p.[process_name]
p.[process_id]

Work_Log1 (w)
w.[activity_id]
w.[process]
w.[acn reviwer]
w.[activity_start_date]
w.[reporting month]

ACN Reviewer (r)
r.[acn_reviewer_id]
r.[reviewer_name]

Process NameACN Reviewer如何相关?如果不是,则无法根据NULL中的Work_Log1值来桥接它们。

答案 1 :(得分:0)

最后一次尝试:我正在考虑....也许你想把这些结果联合到另一个选择,其中work_log1左连接到acn_reviewer(没有首先加入work_log1)以获取情况process为null且acn_reviewer不是?是?没有...?谁知道。我累了。访问不允许完整的外连接和东西......也许这就是你想要做的,实际上?

        select  pw.[activity_id], 
                pw.[activity_start_date], 
                pw.[reporting month] ,
                r.[Reviewer_Name], 
                pw.[process_name] 

        from    ([work_log1] as w

                join [process name] as p 
                on w.[process] = p.[process_id] ) as pw

                    join [acn_reviewer] as r
                    on pw.[ACN Reviwer] = r.[ACN_Reviewer_ID]  

        where   pw.[activity_id] = 54447 

        -- all records in work_log1 that have a matching row both
                    -- in acn_reviewer and process via the join 

        union 


        select  pw.[activity_id], 
                pw.[activity_start_date], 
                pw.[reporting month] ,
                null as [Reviewer_Name], 
                pw.[process_name] 

        from    ([work_log1] as w

                join [process name] as p 
                on w.[process] = p.[process_id] ) as pw

                    left join [acn_reviewer] as r
                    on pw.[ACN Reviwer] = r.[ACN_Reviewer_ID]  

        where   pw.[activity_id] = 54447 and r.[acn reviewer] is null

        -- all records where work_log1, WITH a row in process, 
                    -- WITHOUT a row in acn_reviewer 

        union

        select  pw.[activity_id], 
                pw.[activity_start_date], 
                pw.[reporting month] ,
                r.[Reviewer_Name] as [Reviewer_Name], 
                null as [process_name] 

        from    ([work_log1] as w

                join [acn_reviewer] as r
                on w.[ACN Reviwer] = r.[ACN_Reviewer_ID] ) as wr

                    left join [process name] as p 
                    on w.[process] = p.[process_id]  

        where   pw.[activity_id] = 54447 and p.[process_id] is null

        -- all records where work_log1, WITHOUT a row in process, 
                    -- WITH a row in acn_reviewer 

        union


        select  pw.[activity_id], 
                pw.[activity_start_date], 
                pw.[reporting month] ,
                null as [Reviewer_Name], 
                null as [process_name] 

        from    ([work_log1] as w

                left outer join [acn_reviewer] as r
                on w.[ACN Reviwer] = r.[ACN_Reviewer_ID]  ) as wr

                    left outer join [process name] as p 
                    on wr.[process] = p.[process_id]

        where   pw.[activity_id] = 54447 and p.[process_id] is null and wr.[ACN_Reviewer_ID] is null

        -- all records in work_log1 that have no matching rows in either process or acn_reviewier
                    --  cuzzz its a left outer join and the where says the joined tables return null-thing

访问是奇怪的,如果你将整个事情放入select * from (query with unions) as x where activity_id = 54447但是我不确定,可能会也可能不会喜欢它。我没有测试过这个。但你希望得到这个想法。希望这就是你想要的。 * IF NOT --->像njk这样的ERD提供了我们/你是正确的(b / c你说他错了)会非常有帮助,没有它或没有示例结果集,它显示你需要的NULL我就是无法继续。 *

或...你的第一个查询被剥离了连接?

select  w.[activity_id], 
        w.[activity_start_date], 
        w.[reporting month], 
        r.[Reviewer_Name], 
        p.[process_name]

from    work_log1 as w, acn_reviewer as r, process as p 

where   (w.[acn reviewer] = r.acn_reviewer_id or r.acn_reviewer_id is null) and 
        w.process = p.process_id