2015-02-25 3 views
0

Мне нужно отобразить клиентов, которые приобрели продукт (на основе поиска пользователя) в списке. У меня есть пять разных таблиц в Access, которые хранят различную информацию и которые относятся друг к другу с идентификаторами (с помощью combox boxes в vb). Мне нужно иметь возможность искать продукт, например «Белый хлеб», тогда программа должна отображать полное имя и адрес клиента, хранящиеся в базе данных.Запрос нескольких таблиц и отображение результатов с SQL и доступа

Table: TransactionDetails 
Fields: ID, stockID, custTransID 

Table: CustomerTransaction 
Fields: ID, custID, dateOfTransaction 

Table: CustomerAccountDetails 
Fields: ID, custFullName, custAddress, custLandline, 
     custMobile, custDOB, custCreditDetails 

Table: StockDescription 
Fields: ID, stockName, stockDesc, stockPrice 

Table: SupplierDetails 
Fields: ID, supplierName, supplier Address 

Я думаю, что нужно использовать INNER JOIN для запроса нескольких таблиц сразу, но я не уверен, синтаксиса (я новичок в SQL). До сих пор у меня есть это:

Dim productSearch As String 

    productSearch = productSrchInput.Text 

    Dim databaseConnection As New OleDb.OleDbConnection 
    Dim counter As Integer 
    Dim array(10) As String 

    databaseConnection.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=assignment5database.accdb" 

    databaseConnection.Open() 

    Dim searchDatabase As OleDbCommand = New OleDbCommand("SELECT CustomerAccountDetails.custFullName, CustomerAccountDetails.custAddress " & _ 
                  "FROM CustomerAccountDetails " & _ 
                  "INNER JOIN StockDescription ON TransactionDetails.stockID = TransactionDetails.custTransID " & _ 
                  "WHERE StockDescription.stockName = '" & productSearch & "'", databaseConnection) 
    Dim searchResults As OleDbDataReader = searchDatabase.ExecuteReader 

    counter = 1 

    Do While searchResults.Read 
     srchResultsList.Items.Add(searchResults.Item(0)) 
     counter += 1 
    Loop 
    databaseConnection.Close() 
+0

Вы пытались создать запрос в MS Access с помощью окна дизайна запроса? Есть несколько мастеров, и соединения перетаскиваются. – Fionnuala

+0

Вышеприведенный код ПРИСОЕДИНИТЬ 'Клиентов' с' StockDescription', где у него должен быть другой JOIN с таблицей TransactionDetail. – PaulFrancis

+0

Присоединение к MS Access может усложниться - это очень суетливо о скобках, поэтому мое предложение. – Fionnuala

ответ

0

Вам не хватает некоторых соединений, которые связывают клиента с деталями. Вот SQL, который Access будет ожидать, чтобы вытащить данные на основе вашего описания. Скобки могут казаться посторонними, если вы привыкли к SQL-серверу или MySQL, но Access будет бросать пригонку, если вы их оставите.

SELECT CustomerAccountDetails.custFullName, CustomerAccountDetails.custAddress, StockDescription.stockName 
FROM StockDescription 
    INNER JOIN ((CustomerAccountDetails 
    INNER JOIN CustomerTransaction ON CustomerAccountDetails.ID = CustomerTransaction.custID) 
    INNER JOIN TransactionDetails ON CustomerTransaction.ID = TransactionDetails.custTransID) ON StockDescription.ID = TransactionDetails.StockID 
WHERE StockDescription.stockName="something" 

Как отметил Fionnuala, я почти всегда буду строить запрос, который имеет несколько соединяющий в него с помощью конструктора запросов Access, прежде чем положить его в коде. Я почти всегда оставляю круглые скобки или пытаюсь написать запрос в структуре, которую SQL Server ожидает и получит отказ от Access.

-2

Я думаю, что вы могли бы быть в состоянии использовать внутреннее соединение, но, возможно, «союз» может быть более эффективным.

http://www.w3schools.com/sql/sql_union.asp подходит для улучшения знаний SQL, это очень помогло мне.

+1

Я не вижу, как союзный запрос каким-либо образом имеет значение. – Fionnuala

+0

Ненавижу, чтобы не согласиться. JOIN - это то, что нужно сделать. UNION не находится рядом с требованием OP. – PaulFrancis

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