MS Access多(INNER,LEFT& RIGHT)JOIN查询

时间:2015-06-10 14:52:19

标签: sql ms-access join ms-access-2010 outer-join

好的,这就是事情。我有以下表格:

> YEARS
------------------------------ 
ID    YEAR      ACTUAL
------------------------------ 
1     2014-15   TRUE 
2     2015-16   FALSE


> SHOPS
------------------------------ 
ID    NAME     ...
------------------------------ 
1     ThisShop ...


> ITA
------------------------------ 
ID    YEAR_ID   SHOP_ID
------------------------------ 
1     1         1 
2     1         2 
...


> INSPECTORS
------------------------------ 
ID    INSPECTOR
------------------------------ 
1     M. Black
2     M. White
3     M. Brown
...


> ITA_INSPECTORS
-------------------------------------------------------
ID    ID_ITA    ID_INSPCTR     StartDate    EndDate
-------------------------------------------------------

这就是问题,我想要一个查询来显示所有INSPECTORSITA_INSPECTORS列出的SHOPS ID = 1 AND YEARS ID = 1 ITA_INSPECTORS。如果检查员出现在ITA_ID表中,则显示开始和结束日期,如果没有,则显示没有日期。

请注意,所选商店的ITA_INSPECTORS表中可能没有ITA_INSPECTORS(假设INSPECTORS表为空,我仍然需要查看所有INSPECTOR名称)。

ITA_INSPECTORS表是用于构建SELECT * FROM ((ITA INNER JOIN YEARS ON ITA.ID_YEAR = YEARS.ID) LEFT JOIN ITA_INSPECTORS ON ITA.ID = ITA_INSPECTORS.ID_ITA) RIGHT JOIN INSPECTORS ON ITA_INSPECTORS.ID_INSPCTR = INSPECTORS.ID WHERE ITA.SHOP_ID = 1 AND ((YEARS.ACTUAL) = True); 表的静态数据。

我试过这个问题:

RIGHT JOIN

在我添加Join expression not supported子句之前一直有效,然后我收到错误- (void)getAddressFromLatLon:(double)pdblLatitude withLongitude:(double)pdblLongitude { NSDictionary *adressWithLtLn = @{ @"latitude":[NSNumber numberWithDouble:pdblLatitude], @"longtitude":[NSNumber numberWithDouble:pdblLatitude]}; ^^^^^^^^ }

有人可以指导我这样做的正确方法吗?

1 个答案:

答案 0 :(得分:0)

一个解决方案是拆分查询,使其没有这些冲突的连接 所以创建一个查询,例如q1

SELECT *
FROM (
    (
        ITA INNER JOIN YEARS ON ITA.ID_YEAR = YEARS.ID
        ) LEFT JOIN ITA_INSPECTORS ON ITA.ID = ITA_INSPECTORS.ID_ITA
    )  

然后创建第二个查询以进行所需的正确连接

SELECT INSPECTORS.ID, INSPECTORS.INSPECTOR, q1.*
FROM INSPECTORS LEFT JOIN q1 ON INSPECTORS.ID = q1.ID_ITA;