【问题标题】:How to inner join with PyODBC如何使用 PyODBC 进行内部连接
【发布时间】:2018-03-02 17:01:42
【问题描述】:

更新我更新了我的代码和我收到的错误。

我不确定如何将INNER JOIN 与 Python 的 pypyODBC 一起使用。

我收到一条错误提示

“找不到列“UT”或用户定义的函数或聚合,“UT.userID”,或者名称不明确。”

我尝试在 SELECT 语句中指定表。

关于如何解决此问题的任何建议?

import pypyodbc

def intercard():

    firstname = "Paul"
    key = "334" 

    try:
        connection = pypyodbc.connect('Driver={SQL Server};Server=MyServerName;Database=MyDatabaseName;Trusted_Connection=yes;')
    except pypyodbc.Error as ex:
        sqlstate = ex.args[0]
        if sqlstate == '28000':
            print("You do not have access.") 
    cursor = connection.cursor() 
    SQLCommand = ("SELECT UT.userID, Status, userName "      
        "FROM dbo.StatusTable as ST INNER JOIN dbo.UserTable as UT "   # table name
        "ON ST.userID=UT.userID"
        "(nolock)"
        "WHERE userKey LIKE ? AND First Name LIKE ?")
    Values = ['%' + key + '%', '%' + firstname + '%']
    cursor.execute(SQLCommand,Values)
    results = cursor.fetchone()
    if results:
        print(connections + " " + str(results[0]) + " " + str(results[1])) # enters results in entry
        connection.close()

我只想同时连接到 StatusTableUserTable

** 更新 2 **

我可以直接在 SQL Server 中运行以下命令,并且可以正常工作。但我无法让它在 Python 中工作......

SELECT ST.[userID]

  FROM [dbo].[StatusTable] as ST INNER JOIN [dbo].[UserTable] as UT
  ON ST.userID = UT.userID

  where Name = 'Paul'

【问题讨论】:

  • @Kade - 您在 FROM 子句中将表别名定义为 STUT,然后在 ON 子句中使用 SESP 作为别名。
  • 已修复。我还没有更新那些。
  • @Kade - 在as UT 之后似乎需要一个空格。始终在每个代码片段的末尾放置一个空格,以防止片段粘合在一起时出现意外错误。

标签: python sql-server pyodbc


【解决方案1】:

由于您的编辑历史记录表明有多次更新,以下是解决您的整体 SQL 语法问题的列表。

  1. 在 SQL Server 中,INNER JOIN 必须与 ON 子句配对。您的第一个版本没有这样做。 CROSS JOIN 是唯一不需要 ON 子句和 SQL Server 特定的 CROSS APPLYOUTER APPLY 的连接。

  2. FROMJOIN 子句中使用的表别名必须在所有其他子句中维护:SELECTWHEREGROUP BY。要么坚持 STUTSESP 命名,但保持它们的用法。如果列标识符未在其他地方定义,则不要为其添加前缀。

  3. 应转义具有名称和特殊字符的列标识符以及reserved words。在 SQL Server 中,您可以使用方括号进行转义。因此,First Name 列及其空格需要转义,应为:

    WHERE userKey LIKE ? AND [First Name] LIKE ?
    
  4. 由于 SQL 在其语法中需要正确的标点符号和空格,因此请考虑将 Python 的三引号多行块用于 SQL 语句等长字符串:

    SQLCommand = """SELECT UT.userID, ST.Status, UT.userName      
                    FROM dbo.StatusTable as ST (nolock)
                    INNER JOIN dbo.UserTable as UT (nolock)
                      ON ST.userID = UT.userID
                    WHERE UT.userKey LIKE ? AND UT.[First Name] LIKE ?"""
    
  5. 最后一点,这里没有任何问题是由于 Python 或pypyodbc 与 SQL Server 数据库的接口。由于语法问题,MSSQL 引擎会引发所有此类错误。这些相同的项目在其他 ODBC(即 VBA 的 ADO 或 R 的 RODBC)或非 ODBC(即 Java 的 JDBC 或 Python 的pymssql)连接中会失败。

    有效的底层 SQL 查询与在 Python 中尝试的查询大不相同,例如子句 UT.userID(nolock)WHERE 之间没有空格,没有使用 First Name,也没有滥用表别名。

【讨论】:

    【解决方案2】:

    您需要定义连接 - 您要连接哪些列?例如,如果 StatusTable 和 UserTable 都有一个 userID 列,您的命令将更新为

    SELECT Status, userName     
            FROM dbo.StatusTable as ST INNER JOIN dbo.UserTable  as UT
            ON ST.userId=UT.userID
            (nolock)
            WHERE userKey LIKE ? AND First Name LIKE ?
    

    【讨论】:

    • 两个表中实际上都有一个 userID 列。当我执行上述操作时,我得到“找不到多部分标识符”SE.userID”
    • 这个解决方案中SE在哪里使用?
    【解决方案3】:

    Nolock 放错地方了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-14
      • 2015-02-17
      • 1970-01-01
      • 2013-11-19
      • 2014-05-31
      • 2012-11-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多