LEFT加入MS Access中的其他条件

时间:2010-01-06 20:13:31

标签: sql ms-access left-join

我有以下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)

4 个答案:

答案 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;