如何在Excel中使用SQL联接

大约一年前,我看到一个更新的问题,这个问题让我走了很长一段路要走,但却导致了更多的问题而不是答案。

首先让我说,我不是SQL(DB2,SQLServer,Oracle)的“新手”,但是我相对于在Excel中使用SQL的“新手”。 此外,我在2010年工作,但必须保持与2003年的兼容性。

我想要做的是将一张表中的数据匹配到另一张,并报告exception。 我想从“空行”中select6列,并将它们与“后退订单”中的3列匹配,只显示例外情况。 “开放行”可以是1..n,“后退订单”可以是0..n。 我只想抓住“Back Orders”存在的地方。

要写正常的SQL,我会做这样的事情:

SELECT O.[Part Number], O.[Part Desc], O.[Source Domain], O.[Ship Qty], O.[Date Created], B.[Dest Domain], B.[Quantity], B.[Date Created] FROM [OPEN LINES] O JOIN [Back Orders] B ON O.[Part Number] = B.[Part Number] WHERE B.[Part Number] IS NOT NULL ORDER BY O.[Part Number] 

问题是,我不能通过没有错误的连接。 这是我迄今为止。

 rs.Open "SELECT [OPEN LINES$].[Part Number], [OPEN LINES$].[Part Desc], " $ _ "[OPEN LINES$]. [Source Domain], " & _ "[OPEN LINES$].[Ship Qty], [OPEN LINES$].[Date Created] " & _ "FROM [OPEN LINES$] " & _ "JOIN [Back Orders$] ON [OPEN LINES$].[Part Number] = [Back Orders$].[Part Number] " & _ "ORDER BY [OPEN LINES$].[Part Number] ;", cn 

我将不胜感激您提供的任何帮助。

戈德

尝试这个:

 rs.Open "SELECT [OPEN LINES$].[Part Number], [OPEN LINES$].[Part Desc], " $ _ " [OPEN LINES$]. [Source Domain], " & _ " [OPEN LINES$].[Ship Qty], [OPEN LINES$].[Date Created] " & _ " FROM [OPEN LINES$], [Back Orders$] " & _ " WHERE [OPEN LINES$].[Part Number] = [Back Orders$].[Part Number] " & _ " ORDER BY [OPEN LINES$].[Part Number]", cn 

你不需要结尾的分号。

这是一个更简单的例子(在XL2010中testing)

 Sub SqlJoin() Dim oConn As New ADODB.Connection Dim oRS As New ADODB.Recordset Dim sPath Dim sSQL As String sSQL = "select a.blah from <t1> a, <t2> b where a.blah = b.blah" sSQL = Replace(sSQL, "<t1>", Rangename(Sheet1.Range("A1:A5"))) sSQL = Replace(sSQL, "<t2>", Rangename(Sheet1.Range("C1:C3"))) If ActiveWorkbook.Path <> "" Then sPath = ActiveWorkbook.FullName Else MsgBox "Workbook being queried must be saved first..." Exit Sub End If oConn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source='" & sPath & "';" & _ "Extended Properties='Excel 12.0;HDR=Yes;IMEX=1';" oRS.Open sSQL, oConn If Not oRS.EOF Then Sheet1.Range("E1").CopyFromRecordset oRS Else MsgBox "No records found" End If oRS.Close oConn.Close End Sub Function Rangename(r As Range) As String Rangename = "[" & r.Parent.Name & "$" & _ r.Address(False, False) & "]" End Function