【问题标题】:How to use SQL Joins in Excel如何在 Excel 中使用 SQL 连接
【发布时间】:2013-10-27 05:06:05
【问题描述】:

我看到一个大约一年前更新的问题,让我在找到所需的解决方案方面走了很长一段路,但导致的问题多于答案。

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

我要做的是将一张表中的数据与另一张表中的数据匹配并报告异常。我想从“Open Lines”中选择 6 列并将它们与“Back Orders”中的 3 列相匹配,并且只显示例外情况。 'Open Lines' 可以是 1..n,而 'Back Orders' 可以是 0..n。我只想抓住存在“延期交货”的行。

要编写普通的 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

如果您能提供任何帮助,我将不胜感激。

上帝

【问题讨论】:

  • 您可以使用您的 select 语句在 MSSQL 中创建 store proc Link,然后在没有 VBA 的情况下从 excel 执行 proc link
  • 错字?在rs.Open 的第一行,[Part Desc], " $ _ 应该是[Part Desc], " & _

标签: sql excel join


【解决方案1】:

试试这个:

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 中测试)

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

【讨论】:

  • 谢谢蒂姆 - 你的第一个解决方案就像一个魅力。我现在可以继续下一步了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
  • 2013-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多