如何与PyODBC进行内部联接

时间:2018-03-02 17:01:43

标签: python sql-server pyodbc

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

我不确定如何在Python的pypyODBC中使用INNER JOIN

我收到错误消息

  

"找不到任何一列" UT"或用户定义的函数或聚合," UT.userID",或名称是ambigous。"

我尝试在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()

我只想连接 StatusTable UserTable

**更新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'

3 个答案:

答案 0 :(得分:2)

由于您的编辑历史记录表明有多个更新,因此下面列出了解决整体SQL语法问题的列表。

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

  2. 必须在所有其他子句中维护FROMJOIN子句中使用的表别名:SELECTWHEREGROUP BY。要么坚持 ST UT SE SP namings,要么保持其使用。如果未在其他位置定义列标识符,请不要为其添加前缀。

  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之间没有空格,不使用名字,并且没有滥用表别名

答案 1 :(得分:0)

您需要定义连接 - 您要加入哪些列?例如,如果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 ?

答案 2 :(得分:0)

Nolock在错误的地方。