Câu lệnh kết hợp nhiều SQL


76

Khi tôi chỉ có một phép nối bên trong trong câu lệnh SQL của mình, nó hoạt động hoàn hảo. Tôi đã thử tham gia bảng thứ hai và bây giờ tôi gặp lỗi thông báo rằng có lỗi cú pháp (thiếu toán tử). Có gì sai ở đây?

adsFormView.SelectCommand = "SELECT * FROM [tableCourse] INNER JOIN [tableGrade] ON [tableCourse].[grading] = [tableGrade].[id] INNER JOIN [tableCourseType] ON [tableCourse].[course_type] = [tableCourseType].[id] WHERE [prefix]='" & myPrefix & "' AND [course_number]='" & myCourseNum & "'"

-Hiển thị lệnh chọn trong hộp thư để xem những gì xuất hiện. Tôi nghĩ rằng tham gia của bạn có thể ổn, và vấn đề là với dấu ngoặc kép hoặc cái gì đó.
MAW74656

1
Nếu tôi nhớ chính xác, cú pháp truy cập có bạn kèm theo mỗi lớp với ngoặc vì vậy hãy thửFROM [tableCourse] INNER JOIN [tableGrade] ON [tableCourse].[grading] = [tableGrade].[id] (INNER JOIN [tableCourseType] ON [tableCourse].[course_type] = [tableCourseType].[id])
billinkc

Câu trả lời:


169

Đối với các phép nối nhiều bảng, bạn phải lồng các phép nối thêm vào trong dấu ngoặc:

SELECT ...
FROM ((origintable
JOIN jointable1 ON ...)
JOIN jointable2 ON ...)
JOIN jointable3 ON ...

về cơ bản, đối với mỗi bảng bổ sung bạn tham gia qua bảng đầu tiên, bạn cần một dấu ngoặc vuông trước bảng 'FROM' ban đầu và một dấu ngoặc nhọn đóng trên mệnh đề JOIN 'on' phù hợp.


Đây chính xác là những gì tôi đang tìm kiếm. Nó liên tục cho tôi biết một số cú pháp hoặc phép nối không chính xác khi nó hoạt động hoàn hảo trên SQL Management studio.
Paramone

23

MS Access (cụ thể là Jet / ACE) yêu cầu dấu ngoặc đơn với nhiều phép nối. Thử:

adsFormView.SelectCommand = _
    " SELECT * FROM ([tableCourse] " & _
    " INNER JOIN [tableGrade] " & _
    "     ON [tableCourse].[grading] = [tableGrade].[id]) " & _
    " INNER JOIN [tableCourseType] " & _
    "     ON [tableCourse].[course_type] = [tableCourseType].[id] " & _
    " WHERE [prefix]='" & myPrefix & "'" & _
    "   AND [course_number]='" & myCourseNum & "'"

1
"cụ thể là động cơ Jet db" - không đúng: điều này cũng áp dụng cho phiên bản Access Database Engine (ACE) của động cơ.
onedaywhen

Quan điểm của tôi là yêu cầu về dấu ngoặc đơn đến từ công cụ db , không phải ứng dụng . Nhưng bạn nói đúng, yêu cầu này cũng áp dụng cho ACE / ADE / any-MS-is-call-it-this-days. Tôi đã cập nhật câu trả lời của mình cho phù hợp.
mwolfe02

1
Bạn không bao giờ nên sử dụng nối chuỗi để tạo câu lệnh và truy vấn SQL, thay vào đó hãy sử dụng các tham số.
Đại

1

Mặc dù MS SQL Server, MS Access yêu cầu dấu ngoặc đơn cho nhiều câu lệnh JOIN. Về cơ bản, JOIN là một phép toán giữa hai bảng. Khi bạn có nhiều hơn một JOIN, trên thực tế, bạn đang nối kết quả của JOIN trước đó vào một bảng khác. Logic này được xếp tầng cho bất kỳ THAM GIA bổ sung nào. Ví dụ: nếu bạn có các phép toán JOIN giữa 4 bảng, bạn cần viết nó như sau:

SELECT * FROM
    (
        ( Table1 JOIN Table2 ON Table1.column1 = Table2.column2) --result of JOIN is treated as a temp table
         JOIN Table3 ON Table1.column1 = Table3.column3
    ) --result of JOIN is treated as another temp table
    JOIN Table4 ON Table4.column4 = Table2.column2
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.