2009-04-27 41 views
8

TSQL (như được sử dụng trong MS SQL Server 2000 và 2005) cho phép nhiều mệnh đề JOIN, một mệnh đề bên phải, không có dấu phẩy hoặc dấu ngoặc đơn cần thiết. Hãy thử điều này trong Access và nó ném phù hợp: "Lỗi cú pháp (thiếu toán tử) trong biểu thức truy vấn ..."Chuyển đổi TSQL sang MS-Access SQL

Từ những gì tôi có thể tập hợp trong Google-land, Access SQL muốn dấu ngoặc đơn để nhóm JOIN mệnh đề. Hầu hết các lời khuyên về cách thực hiện điều này là sử dụng khung nhìn thiết kế hoặc trình hướng dẫn truy vấn, và cho phép Access tìm ra vị trí đặt các dấu ngoặc đơn (không bắt buộc trong SQL chuẩn). Vấn đề là, tôi rất quen với việc thực hiện SQL của mình trong một trình soạn thảo văn bản (Notepad, SSMS, VS2005, bất cứ điều gì) mà khung nhìn thiết kế và trình hướng dẫn cản trở và làm cho quá trình thu thập thông tin của tôi bị thu hẹp. Đôi khi các trình thuật sĩ đưa ra giả định xấu về những gì để tham gia nếu có nhiều khả năng, và tôi rất quen với việc tự làm điều đó trong TSQL mà tôi muốn để lại các trình thuật sĩ trong số đó.

Không có công cụ nào sẽ chuyển đổi TSQL thành Access SQL hoặc ít nhất một bộ quy tắc về vị trí đặt dấu ngoặc đơn?

Ví dụ:

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 
+0

Tìm thấy rằng việc sử dụng Cú pháp tương thích SQL Server (ANSI 92) cũng không giúp ích gì. – JeffO

Trả lời

2

Yah, MS-Access là câm.

Tôi không nghĩ rằng một tồn tại (có lẽ không phải là một thị trường lớn hoặc là để đi từ MS-SQL/TSQL để MS-Access). Thông thường, tôi sử dụng Design View mà không thực sự là một thuật sĩ như xa như tôi đang quan tâm. Sau đó tôi thêm các bảng theo cách thủ công, và sau đó (nếu tôi chưa tạo ra một sơ đồ quan hệ thích hợp, hoặc một cái gì đó hơi sôi nổi), hãy tạo các mối quan hệ trong Trình thiết kế theo cách thủ công. Sau đó, tôi kiểm tra truy vấn trong khung nhìn SQL và sửa chữa khi cần.

Trong trường hợp ví dụ của bạn (như bạn đã chỉ ra), bạn có thể cần dấu ngoặc đơn và sẽ phải thêm chúng theo cách thủ công. Bạn có thể muốn một cái gì đó như thế này:

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ếu bạn có N bên tham gia, bạn sẽ cần N-1 mở ngoặc ngay từ đầu, và một trên từng chấm dứt của tham gia; trừ người cuối cùng)

+0

Cảm ơn. Thật không may, bây giờ tôi nhận được "Lỗi cú pháp trong khoản FROM". Tôi đoán tôi sẽ cung cấp cho nhà thiết kế một cảnh quay khác. –

+0

Rất tiếc ... Tôi nghĩ rằng tôi đặt dấu ngoặc đơn mở ở vị trí sai. Tôi đã cập nhật ví dụ của mình. – BIBD

+1

Có !! Cảm ơn!! Đó là nó, cùng với bao quanh các tên bảng được gạch nối với dấu ngoặc đơn. Tôi cũng phát hiện ra rằng quy ước đặt tên của tôi đã ném ra khỏi Nhà thiết kế. (Nó không giống như PK của mỗi bảng chỉ là "ID", vì vậy nó chèn quá nhiều vào các mệnh đề trong các kết nối được sinh ra của nó) –

0

Tính năng này hoạt động trong 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 

Như bạn có thể thấy, các bảng được nối sẽ được nhóm lại với nhau.