Ms-Access

如何在一列上選擇不同的列並返回所有其他列?

  • December 12, 2016

我正在使用 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。

引用自:https://dba.stackexchange.com/questions/157732