2013-08-08 2 views
2

У меня есть этот код и продолжайте получать синтаксическую ошибку.Соедините три таблицы в JDBC

query = "SELECT * "+ 
"FROM Product " + 
"INNER JOIN Orders ON (Product.ItemID=Orders.ItemID) " + 
"LEFT OUTER JOIN SupplierProduct ON (Orders.ItemID=SupplierProduct.ItemID) "+ 
"WHERE Product.Receiver = 'Fred' " + 
"ORDER BY Product.ItemName";  

DefaultTableModel data = table.getQuery(query); 

Я также попробовал INNER JOIN вместо LEFT OUTER JOIN. Ошибка, которую я продолжаю получать, когда-либо пытаюсь.

java.sql.SQLException: [Microsoft][ODBC Microsoft Access Driver] Syntax error (missing  operator) in query expression '(Product.ItemID=Orders.ItemID) LEFT OUTER JOIN SupplierProduct ON (Orders.ItemID=SupplierProduct.ItemID'. 
at sun.jdbc.odbc.JdbcOdbc.createSQLException(Unknown Source) 
at sun.jdbc.odbc.JdbcOdbc.standardError(Unknown Source) 
at sun.jdbc.odbc.JdbcOdbc.SQLExecDirect(Unknown Source) 
at sun.jdbc.odbc.JdbcOdbcStatement.execute(Unknown Source) 

Что мне здесь не хватает или как я могу присоединиться к три таблицы.

+0

Взгляните на: http://stackoverflow.com/questions/10852499/access-2010-syntax-error-missing-operator-in-query-expression –

ответ

2

Попробуйте использовать круглые скобки, как это:

query = "SELECT * "+ 
     "FROM (Product " + 
     "INNER JOIN Orders ON (Product.ItemID=Orders.ItemID)) " + 
     "LEFT OUTER JOIN SupplierProduct ON (Orders.ItemID=SupplierProduct.ItemID) "+ 
     "WHERE Product.Reciever = 'Fred' " + 
     "ORDER BY Product.ItemName"; 
+0

Спасибо, что это работало для меня. Я не знал, что нужны скобки. – Themonkey180

0

Похоже JDBC может испытывать трудности разбора порядка стыки. Это, вероятно, вопрос специфичен для базы данных двигателя вы взаимодействующие с, но в любом случае, любым двигателем должен быть в состоянии правильно разобрать запрос, если вы используете скобки, чтобы указать порядок операций соединения:

query = "SELECT * "+ 
"FROM (Product " + 
"INNER JOIN Orders ON (Product.ItemID=Orders.ItemID)) " + 
"LEFT OUTER JOIN SupplierProduct ON (Orders.ItemID=SupplierProduct.ItemID) "+ 
"WHERE Product.Reciever = 'Fred' " + 
"ORDER BY Product.ItemName";  

DefaultTableModel data = table.getQuery(query); 

Подробнее подробности:

В принципе, идея состоит в разделении каждого соединения, чтобы его можно было интерпретировать более или менее как отдельную таблицу. Это служит для более полного отличить

SELECT * 
FROM (Table1 JOIN Table2 ON Table1.a = Table2.a) 
    JOIN Table3 on Table3.b = Table2.b 

от

SELECT * 
FROM Table1 
    JOIN (Table2 JOIN Table3 on Table3.b = Table2.b) ON Table1.a = Table2.a 

Кроме того, обратите внимание, что есть шанс, что вам нужно будет псевдоним результат первого соединения, как в:

SELECT * 
FROM (Table1 JOIN Table2 ON Table1.a = Table2.a) as join1 
    JOIN Table3 on Table3.b = join1.b 
+0

Благодарим вас за подробности. Помогите мне понять это. – Themonkey180

Смежные вопросы