7

TSQL(在 MS SQL Server 2000 和 2005 中使用)允许多个 JOIN 子句,一个接一个,不需要逗号或括号。在 Access 中试试这个,它会抛出一个合适的结果:“查询表达式中的语法错误(缺少运算符)......”

根据我在 Google 中收集到的信息,Access SQL 需要括号来对 JOIN 子句进行分组。关于如何完成此操作的大多数建议是使用设计视图或查询向导,并让 Access 找出将括号放在哪里(在标准 SQL 中不需要)。问题是,我太习惯在文本编辑器(记事本、SSMS、VS2005 等等)中执行我的 SQL,以至于设计视图和向导阻碍了我的皮肤爬行。有时,如果有多种可能性,向导会对加入什么做出错误的假设,而且我已经习惯于自己在 TSQL 中做这件事,以至于我宁愿让向导排除在外。

是否没有将 TSQL 转换为 Access SQL 的工具,或者至少有一组关于放置括号的规则?

例子:

SELECT ...
FROM Participant PAR
    INNER JOIN Individual IND 
        ON PAR.APETSID = IND.APETSID
    INNER JOIN Ethnicity ETH 
        ON IND.EthnicityID = ETH.ID
    INNER JOIN Education EDU 
        ON IND.EducationID = EDU.ID
    INNER JOIN Marital MAR 
        ON IND.Marital = MAR.ID
    INNER JOIN Participant-Probation PXP 
        ON PAR.ID = PXP.ParticipantID
    INNER JOIN Probation PBN 
        ON PXP.ProbationID = PBN.ID
    INNER JOIN Class-Participant CXP 
        ON PAR.ID = CXP.ParticipantID
    INNER JOIN Class CLS 
        ON CXP.ClassID = CLS.ID
    INNER JOIN Official OFR 
        ON PAR.ReferringPO = OFR.ID
    INNER JOIN Participant-Official PXO 
        ON PAR.ID = PXO.ParticipantID
    INNER JOIN Official OFA 
        ON PXO.OfficialID = OFA.ID
4

2 回答 2

3

是的,MS-Access 是愚蠢的。

我认为不存在(从 MS-SQL/TSQL 到 MS-Access 的市场可能也不大)。通常,我使用设计视图,就我而言,它并不是真正的向导。然后我手动添加表,然后(如果我没有创建适当的关系船图,或者有些古怪)在设计器中手动创建关系。之后,我在 SQL 视图中检查查询并根据需要进行更正。

在您的示例中(如您所示),您可能需要括号,并且必须手动添加它们。你可能想要这样的东西:

SELECT ...
FROM (((Participant PAR
    INNER JOIN Individual IND 
        ON PAR.APETSID = IND.APETSID)
    INNER JOIN Ethnicity ETH 
        ON IND.EthnicityID = ETH.ID)
    INNER JOIN Education EDU 
        ON IND.EducationID = EDU.ID)
    INNER JOIN Marital MAR 
        ON IND.Marital = MAR.ID

(如果您有 N 个内连接,则开头需要 N-1 个左括号,连接结束时需要一个左括号;不包括最后一个)

于 2009-04-27T20:01:25.843 回答
0

这适用于 Access。

SELECT *
FROM (((Individual AS IND 

INNER JOIN Ethnicity AS ETH 
    ON IND.EthnicityID = ETH.ID) 

INNER JOIN Education AS EDU 
    ON IND.EducationID = EDU.ID) 

INNER JOIN Marital AS MAR 
    ON IND.Marital = MAR.ID) 

INNER JOIN (((((((Participant AS PAR 

    INNER JOIN Official AS OFR 
        ON PAR.ReferringPO = OFR.ID) 

    INNER JOIN [Class-Participant] AS CXP 
        ON PAR.ID = CXP.ParticipantID) 

    INNER JOIN Class AS CLS 
        ON CXP.ClassID = CLS.ID) 

    INNER JOIN [Participant-Official] AS PXO 
        ON PAR.ID = PXO.ParticipantID) 

    INNER JOIN Official AS OFA 
        ON PXO.OfficialID = OFA.ID) 

    INNER JOIN [Participant-Probation] AS PXP 
        ON PAR.ID = PXP.ParticipantID) 

    INNER JOIN Probation AS PBN 
        ON PXP.ProbationID = PBN.ID) 

 ON IND.APETSID = PAR.APETSID

如您所见,要连接的表被分组在一起。

于 2009-04-27T23:08:45.520 回答