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'