【问题标题】:SQL / Excel Query Parameter with a JOIN带有 JOIN 的 SQL/Excel 查询参数
【发布时间】:2012-11-29 03:56:21
【问题描述】:

我正在学习如何在 excel 驱动的 SQL 查询中使用参数(实际上我总体上还在学习 SQL)。感谢helped me build my query to modify the results as I need 的好心人,我想更进一步,在 Excel 中提供一个参数来过滤结果。

这是我的查询:

SELECT 
    fun.FUNCTION_ID
    ,COALESCE(fun.parent_function, fun2.function_id) as PARENT_FUNCTION
    ,fun.MODULE_ID
    ,fun.DESCRIPTION
    ,fun.FUNCTION_PURPOSE
    ,fun.PB_OBJECT
    ,sec.GROUP_ID
    ,sec.ACCESS_LEVEL
from 
    MODULE_FUNCTION fun

    LEFT JOIN MODULE_FUNCTION fun2
    ON fun.function_id = fun2.function_id
    AND fun2.function_id IN (SELECT parent_function FROM MODULE_FUNCTION)

    LEFT OUTER JOIN FUNCTION_SECURITY sec
    ON fun.FUNCTION_ID = sec.FUNCTION_ID
    AND sec.GROUP_ID = 'GROUP_NAME'

我需要做的是允许团队中的人员在 Excel 工作表中运行此查询,并在第二个 JOIN 中为“GROUP_NAME”提供他们的组名。不幸的是,我不能使用语法WHERE (sec.GROUP_ID = ?) (found here),因为我需要从 MODULE_FUNCTION 表中提取所有结果,并且只在提供的组匹配时从 FUNCTION_SECURITY 表的右侧插入结果(当有不匹配)。

当我最后尝试使用 AND (sec.GROUP_ID = ?) 时,我在 Excel 中得到一个 “无效参数编号”。从我收集到的“?”只能与 WHERE 一起使用(并且可以在测试查询中为我找到工作)。

我尝试了很多方法,包括声明@parameter,但无济于事。

我很想尝试this technique,但我想尽可能避免使用 VB。

【问题讨论】:

    标签: sql sql-server excel parameters


    【解决方案1】:

    我知道你说过你想避免使用 VB,但它对于你想做的事情来说并不太复杂。

    您可以让工作表有一个用于组名的单元格,然后是一个调用宏的按钮,您可以在其中更改 sql 查询以针对 group_id 进行调整。

    类似:

    Dim sql As String
    
    sql = "select ... from ... and sec.GROUP_ID = '?'"
    sql = Replace(sql, "?", Worksheets("Analysis").Range("A1").Value)
    
    With ActiveWorkbook.Connections("connection name").OLEDBConnection
        .CommandText = sql
        .Refresh
    End With
    

    地点:

    Worksheets("Analysis").Range("A1").Value
    

    是 Group_ID。您可以将其设置为工作簿中任何工作表中的特定单元格。我会在它旁边创建一个按钮,称为“刷新表”或类似的东西。

    如果您已经创建了一个链接到数据库的表,那么 Excel 中有一个连接对象。转到“数据”选项卡,然后单击“连接”。将弹出一个新窗口。查找与 SQL 查询匹配的连接。单击该连接并单击“属性”,然后将连接名称更改为简单的名称(通常是基于您连接到的服务器/表的一些长名称)。将其用于

    ActiveWorkbook.Connections("connection name")
    

    部分。

    链接到工作表上的创建按钮和链接到宏:

    http://office.microsoft.com/en-us/excel-help/add-a-button-and-assign-a-macro-to-it-in-a-worksheet-HP010236676.aspx

    【讨论】:

    • 真的那么简单吗?我对 VB 感到困惑,但这似乎很容易。我稍后会尝试并通知您。
    • @alteredNate 好吧,一开始可能会让人感到困惑,但一旦你进入了大局,它就不会那么糟糕了。我不确定您对此了解多少,因此如果您在实施我的答案时需要更多帮助,请告诉我。我很乐意为您详细解释。
    • 好吧,实际上我知道的很少 :) 我正要深入研究您的代码以及我链接到的代码并尝试理解。如果您对我的具体案例进行更详细的解释,我将不胜感激!在 SQL 查询、数据透视表和数据库管理之间,我目前正在学习很多东西,而 VB 最初并没有出现在这个列表中!哈!
    • @alteredNate 知道了。我更新了答案以包含更多信息和如何创建链接到宏的按钮的链接。此外,YouTube 是一个查找从 VBA 开始的简单视频的好地方。例如:youtube.com/watch?v=zt3Yan14ERs
    • 谢谢!我已经尽我所能,我得到了连接名称,包含我想要的值的工作表名称,我将你的 VB 包装到一个 Sub 中,使它成为一个链接到按钮的宏。我小心地将我的 SQL 插入到一行长字符串中,但出现“类型不匹配”错误。 (我尝试了 VB 调试,显然它卡在.CommandText 步骤(“运行时错误'13' - 类型不匹配)。我知道这不是连接字符串或工作表名称,因为如果我伪造那些我得到一个不同的错误。有什么想法吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-02
    • 1970-01-01
    • 2019-12-22
    • 2013-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多