Ms-Access
如何在一列上選擇不同的列並返回所有其他列?
我正在使用 vb.net/access/Microsoft.Jet.OLEDB.4.0/DbaseIV 來執行此操作。vb.net 和 SQl Server 之間的語法不同,所以我遇到了麻煩。
我需要在數據中選擇每個版本之一(使用程式碼欄位),同時將所有列保留在最終輸出中。我在程式碼欄位上選擇不同的,但我不知道如何返回其餘列。
問題在於這條線
Dim sql2 = "SELECT DISTINCT " & Field1 & " INTO NewTable " & " from " & TableName
這是我的所有程式碼:
**Dim ofd As New OpenFileDialog With ofd .Filter = "DBASE File (*.dbf)|*.dbf" .Multiselect = False .CheckFileExists = True End With If ofd.ShowDialog() = DialogResult.OK Then Dim fi As New IO.FileInfo(ofd.FileName) Dim cn As New OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=dBase IV;Data Source='" _ & fi.DirectoryName & "'") Dim TableName As String = fi.Name.Substring(0, fi.Name.Length - fi.Extension.Length) Dim cmd As New OleDb.OleDbCommand(TableName, cn) cmd.CommandType = CommandType.TableDirect cn.Open() Dim rdr As OleDb.OleDbDataReader = cmd.ExecuteReader dt.Load(rdr) SelectField.ShowDialog() Dim dBaseConnection As New System.Data.OleDb.OleDbConnection(“Provider=Microsoft.Jet.OLEDB.4.0;” & “Data Source=” & path & “;” & “Extended Properties=dBase IV”) dBaseConnection.Open() Dim SQLCreateCommand As String Dim sql2 = "SELECT DISTINCT " & Field1 & " INTO NewTable " & " from " & TableName Dim dBaseCommand As New System.Data.OleDb.OleDbCommand(sql2, dBaseConnection) dBaseCommand.ExecuteNonQuery() dBaseConnection.Close() cn.Close() cn.Dispose() End If**
一些 SQL 數據庫允許您執行以下操作:
SELECT DISTINCT ON(Version) FirstName, LastName /* INTO NewTable */ FROM Table ;
此“DISTINCT ON(x)”僅由有限數量的數據庫實現。我不認為它是由“Access”實現的,我認為它很可能不是由“dBase IV”介面實現的。
Access 使用的 SQL(不知道 dBase IV 變體是否有效)可能會讓您做一些等效的事情:
SELECT Version, first(FirstName) AS FirstName, first(LastName) AS LastName FROM (SELECT * FROM TableName ORDER BY Version /* and whichever columns make sense for your purpose */ ) AS OrderedTable GROUP BY Version ;
首先是一個聚合函式,它與 GROUP BY 一起,將確保您為每個組獲得一個值。該值將是“為該組找到的第一個值”,因此您需要以合理的方式首先訂購您的桌子。
如果這些形式都不起作用…我的猜測是您將不得不在 SQL 之外解決問題,將 RecordSet 放入您的程序中,循環檢查並插入 NewTable。