我有以下T-SQL查询(一个简单的测试用例)在MS SQL中正常运行但无法在MS Access(JET-SQL)中获得等效查询。问题是LEFT JOIN中的附加标准。 如何在MS Access中执行此操作?
T-SQL:
SELECT * FROM A
LEFT OUTER JOIN B ON A.ID = B.A_ID
AND B.F_ID = 3
JET-SQL(我到目前为止但崩溃了Access!):
SELECT * FROM dbo_A
LEFT JOIN dbo_B ON (dbo_A.ID = dbo_B.A_ID AND dbo_B.F_ID = 3)
答案 0 :(得分:12)
您需要使用子选择来应用条件:
SELECT *
FROM dbo_A LEFT JOIN
[SELECT dbo_B.* FROM dbo_B WHERE dbo_B.F_ID = 3]. AS dbo_B
ON dbo_A.ID = dbo_B.A_ID;
如果您在启用“SQL 92”兼容模式的情况下运行Access,则可以执行更标准的操作:
SELECT *
FROM dbo_A LEFT JOIN
(SELECT dbo_B.* FROM dbo_B WHERE dbo_B.F_ID = 3) AS dbo_B
ON dbo_A.ID = dbo_B.A_ID;
您是否需要在Access中进行编辑?如果没有,只需使用本机T-SQL的passthrough查询。如果是这样,我可能会为此创建一个服务器端视图,我特别想在服务器端移动它,如果文字值是你要参数化的东西(即,F_ID = 3真的是F_ID = N其中N是在运行时选择的值。
顺便说一下,我在Access中工作时每天编写这些子选择派生表SQL语句。这不是什么大不了的事。
答案 1 :(得分:1)
崩溃时是否收到错误消息或是否锁定?从dbo_B名称来看,我猜这些是Access中的链接表。我相信当你进行连接时,Access不会告诉SQL服务器它需要连接的结果,它会说“给我两个表的所有行”然后它会尝试自己加入它们。如果表格非常大,则可能导致应用程序锁定。
最好在SQL Server上创建一个视图,以满足您的需求。
答案 2 :(得分:0)
我认为ms访问期望Joins ON子句的每个部分中的两个表名称。作为技巧,这对我有用:
SELECT * FROM A
LEFT OUTER JOIN B ON A.ID = B.A_ID
AND B.F_ID = IIF(True, 3, A.ID)
A.ID或表A中的其他任何字段
答案 3 :(得分:-4)
最后一个条件在技术上不是连接,而是与文字值的比较。把它放在一个WHERE子句中:
SELECT *
FROM a LEFT OUTER JOIN b ON a.ID = b.a_id
WHERE b.f_id = 3;