使用 SQL 和 Access 查询多个表并显示结果
Querying multiple tables and displaying the outcome wtih SQL and Access
我需要在列表框中显示已购买产品(基于用户搜索)的客户。我在 Access 中有五个不同的表,它们存储不同的信息并通过 ID 相互关联(使用 vb 中的组合框)。我需要能够搜索产品,例如 "White Bread",然后程序应显示存储在数据库中的客户全名和地址。
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()
我认为您可以使用内部联接,但也许 "union" 可能更有效。
http://www.w3schools.com/sql/sql_union.asp对提高sql知识很有帮助,对我帮助很大
您缺少一些将客户连接到库存详细信息的联接。这是 Access 期望的 SQL,以便根据您的描述提取数据。如果您习惯于 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 服务器期望并被 Access 拒绝的结构编写查询。
我需要在列表框中显示已购买产品(基于用户搜索)的客户。我在 Access 中有五个不同的表,它们存储不同的信息并通过 ID 相互关联(使用 vb 中的组合框)。我需要能够搜索产品,例如 "White Bread",然后程序应显示存储在数据库中的客户全名和地址。
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()
我认为您可以使用内部联接,但也许 "union" 可能更有效。
http://www.w3schools.com/sql/sql_union.asp对提高sql知识很有帮助,对我帮助很大
您缺少一些将客户连接到库存详细信息的联接。这是 Access 期望的 SQL,以便根据您的描述提取数据。如果您习惯于 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 服务器期望并被 Access 拒绝的结构编写查询。