更新我更新了我的代码和我收到的错误。
我不确定如何在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'
答案 0 :(得分:2)
由于您的编辑历史记录表明有多个更新,因此下面列出了解决整体SQL语法问题的列表。
在SQL Server中,INNER JOIN
必须与ON
子句配对。你的第一个版本没有这样做。 CROSS JOIN
是唯一不需要ON
子句和SQL Server特定CROSS APPLY
或OUTER APPLY
的联接。
必须在所有其他子句中维护FROM
或JOIN
子句中使用的表别名:SELECT
,WHERE
或GROUP BY
。要么坚持 ST 和 UT 或 SE 和 SP namings,要么保持其使用。如果未在其他位置定义列标识符,请不要为其添加前缀。
应转义包含姓名和特殊字符以及reserved words的列标识符。在SQL Server中,您可以使用方括号进行转义。因此, First Name 列及其空格需要转义,并应显示为:
WHERE userKey LIKE ? AND [First Name] LIKE ?
因为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 ?"""
最后请注意,这里没有任何问题是由于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在错误的地方。