MS Access INNER JOIN/LEFT JOIN 问题

Posted

技术标签:

【中文标题】MS Access INNER JOIN/LEFT JOIN 问题【英文标题】:MS Access INNER JOIN/LEFT JOIN problems 【发布时间】:2017-07-13 20:04:08 【问题描述】:

我有以下 SQL 字符串,它尝试在 FROM 部分中将 INNER JOIN 与 LEFT JOIN 结合起来。

如您所见,我使用表 VIP_APP_VIP_SCENARIO_DETAIL_LE 来执行查询。当我对这个表使用它时,Access 给我一个“无效操作”错误。

有趣的是,当我使用 VIP_APP_VIP_SCENARIO_DETAIL_BUDGET 或 VIP_APP_VIP_SCENARIO_DETAIL_ACTUALS 表使用 EXACT 相同的查询时,它完美地执行。

那么为什么它可以在两张桌子上工作,而在另一张桌子上却不行?所有字段都在所有表中,数据类型正确。

附带说明:在出现错误的查询中,如果我将 LEFT JOIN 更改为 INNER JOIN,它运行没有问题!不过我真的需要一个 LEFT JOIN。

 SELECT 
    D.MATERIAL_NUMBER, 
    D.MATERIAL_DESCRIPTION,  
    D.PRODUCTION_LOT_SIZE, 
    D.STANDARDS_NAME, 
    D.WORK_CENTER, 
    S.OP_SHORT_TEXT, 
    S.OPERATION_CODE, 
    D.LINE_SPEED_UPM, 
    D.PERCENT_STD, 
    D.EQUIPMENT_SU, 
    D.EQUIPMENT_CU, 
    D.OPERATOR_NUM, 
    V.COSTING_LOT_SIZE, 
    V.VOL_TOTAL_ADJ 

    FROM 
    ([STDS_SCENARIO: TEST] AS D INNER JOIN MASTER_SUMMARY AS S ON
     D.MATERIAL_NUMBER = S.MATERIAL_NUMBER AND D.WORK_CENTER = S.WORK_CENTER) 

    LEFT JOIN 
      (SELECT ITEM_CODE, COSTING_LOT_SIZE, VOL_TOTAL_ADJ 
       FROM 
       VIP_APP_VIP_SCENARIO_DETAIL_LE 
       WHERE SCENARIO_ID = 16968) AS V ON D.MATERIAL_NUMBER = V.ITEM_CODE

    ORDER BY D.MATERIAL_NUMBER, D.STANDARDS_NAME, S.OPERATION_CODE;

【问题讨论】:

您是否尝试过将子查询放在它自己的查询中,然后使用它而不是子查询? 见:***.com/q/12273602/1422451 嗨,Erik - 不确定你的意思。当我自己测试时,左连接的子选择部分工作正常。作为左连接的一部分,它没有。奇怪的是,当我将其更改为 INNER 连接时,它工作正常。将其改回左连接,它再次不起作用。 【参考方案1】:

尝试在 SQL Server 中使用我自己的一些表来模拟它,但结构似乎有效,这遵循上面引用的模式。 (希望这里没有语法错误)

SELECT * FROM (
    select 
        D.MATERIAL_NUMBER, 
        D.MATERIAL_DESCRIPTION,  
        D.PRODUCTION_LOT_SIZE, 
        D.STANDARDS_NAME, 
        D.WORK_CENTER, 
        S.OP_SHORT_TEXT, 
        S.OPERATION_CODE, 
        D.LINE_SPEED_UPM, 
        D.PERCENT_STD, 
        D.EQUIPMENT_SU, 
        D.EQUIPMENT_CU, 
        D.OPERATOR_NUM
    FROM [STDS_SCENARIO: TEST] D 
    INNER JOIN MASTER_SUMMARY S
        ON D.MATERIAL_NUMBER = S.MATERIAL_NUMBER AND D.WORK_CENTER = S.WORK_CENTER) AS J
    LEFT JOIN 
      (SELECT ITEM_CODE, COSTING_LOT_SIZE, VOL_TOTAL_ADJ 
       FROM 
       VIP_APP_VIP_SCENARIO_DETAIL_LE 
       WHERE SCENARIO_ID = 16968) AS V ON J.MATERIAL_NUMBER = V.ITEM_CODE
    ORDER BY J.MATERIAL_NUMBER, J.STANDARDS_NAME, J.OPERATION_CODE;

【讨论】:

谢谢 Dudley - 我认为这最终成为我的 Access 数据库中链接的 Oracle 表的问题。投射左连接链接字段修复了它。非常感谢您抽出时间来解决这个问题。【参考方案2】:

在朋友的帮助下,我们发现这是链接的 Oracle 表和 Access 表之间的转换问题。为了解决这个问题,我们将链接字段的两边都转换为字符串:

CSTR(D.[MATERIAL_NUMBER]) = CSTR(V.[ITEM_CODE])

【讨论】:

以上是关于MS Access INNER JOIN/LEFT JOIN 问题的主要内容,如果未能解决你的问题,请参考以下文章

sql JOINs - JOIN,INNER JOIN,LEFT JOIN,RIGHT JOIN,CROSS JOIN

inner join left join right join 和full join的区别

(', CROSS, FULL, INNER, JOIN, LEFT, NATURAL, ON, RIGHT 或 USING 预期,得到'WITH'

Mysql之inner join,left join,right join详解

join,left join,inner join的区别?

inner join/ left join/right join 之间的区别