2 回答

TA貢獻1865條經驗 獲得超7個贊
因為Order
是SQL Server 關鍵字,所以您需要對標識符進行轉義,例如使用方括號:[Order]
。否則編譯器認為您正在嘗試調用該ORDER BY
命令。最好使用表別名來避免重復較長的表名:
sql = """SELECT pi.mrn
? ? ? ? ? ? ? ? , a.lastname
? ? ? ? ? ? ? ? , v.visitnumber
? ? ? ? ? ? ? ? , pi.firstname?
? ? ? ? ? ? ? ? , pi.lastname?
? ? ? ? ? ? ? ? , a.firstname?
? ? ? ? ? ? ? ? , r.lastsigndate
? ? ? ? ? ? ? ? , o.proceduredesclist
? ? ? ? ? ? ? ? , v.facility
? ? ? ? ? ? ? ? , o.completedate
? ? ? ? ? ? ? ? , o.fillerordernumber?
? ? ? ? ?FROM?
? ? ? ? ? ? ?(
? ? ? ? ? ? ? ?(comm4.dbo.[ORDER] o
? ? ? ? ? ? ? ? INNER JOIN comm4.dbo.report r
? ? ? ? ? ? ? ? ? ? ? ON o.reportid = r.reportid)?
? ? ? ? ? ? ?INNER JOIN?
? ? ? ? ? ? ? ?(comm4.dbo.patientinfo pi
? ? ? ? ? ? ? ? INNER JOIN comm4.dbo.visit v?
? ? ? ? ? ? ? ? ? ? ? ON pi.patientid = v.patientid)?
? ? ? ? ? ? ? ?ON o.visitid = v.visitid
? ? ? ? ? ? ?)?
? ? ? ? ?INNER JOIN comm4.dbo.accountpersonalinfo a
? ? ? ? ? ? ? ?ON r.signeracctid = a.accountid?
? ? ? ? ?WHERE pi.mrn <> 'TEMPORARY'?
? ? ? ? ? ?AND r.lastsigndate >= {ts '2020-09-01 00:00:00'}?
? ? ? ? ? ?AND r.lastsigndate <? {ts '2020-10-01 00:00:00'}
? ? ? ? ?ORDER BY r.lastsigndate
? ? ? ? ? ? ? ? ? , pi.mrn
? ? ?"""
雖然帶括號的嵌套連接是允許的(讓人想起 MS Access SQL),但您可以避免這種嵌套,因為所有連接都是INNER. 更扁平的 SQL 語句可以提高可讀性和可維護性。
sql = """SELECT pi.mrn
? ? ? ? ? ? ? ? , a.lastname
? ? ? ? ? ? ? ? , v.visitnumber
? ? ? ? ? ? ? ? , pi.firstname?
? ? ? ? ? ? ? ? , pi.lastname?
? ? ? ? ? ? ? ? , a.firstname?
? ? ? ? ? ? ? ? , r.lastsigndate
? ? ? ? ? ? ? ? , o.proceduredesclist
? ? ? ? ? ? ? ? , v.facility
? ? ? ? ? ? ? ? , o.completedate
? ? ? ? ? ? ? ? , o.fillerordernumber?
? ? ? ? ?FROM comm4.dbo.[ORDER] o
? ? ? ? ?INNER JOIN comm4.dbo.report r
? ? ? ? ? ? ? ?ON o.reportid = r.reportid
? ? ? ? ?INNER JOIN comm4.dbo.visit v?
? ? ? ? ? ? ? ?ON o.visitid = v.visitid?
? ? ? ? ?INNER JOIN comm4.dbo.patientinfo pi
? ? ? ? ? ? ? ?ON pi.patientid = v.patientid
? ? ? ? ?INNER JOIN comm4.dbo.accountpersonalinfo a
? ? ? ? ? ? ? ?ON r.signeracctid = a.accountid?
? ? ? ? ?WHERE pi.mrn <> 'TEMPORARY'?
? ? ? ? ? ?AND r.lastsigndate >= {ts '2020-09-01 00:00:00'}?
? ? ? ? ? ?AND r.lastsigndate <? {ts '2020-10-01 00:00:00'}
? ? ? ? ?ORDER BY r.lastsigndate
? ? ? ? ? ? ? ? ? , pi.mrn
? ? ?"""

TA貢獻1836條經驗 獲得超4個贊
你的sql語法中有幾個錯誤,執行連接時不需要額外的括號“((”。你不必擔心縮進SQL語句,但是python縮進和換行可能有點棘手。為了簡化你的代碼,你可以在Python中利用多行字符串(即使用""" some string """),例如。
import pymssql
conn = pymssql.connect(server= 'xxx',
user= 'xxx',
password= 'xxx',
database= 'xxx'
)
cursor = conn.cursor()
sql = """
SELECT
PatientInfo.MRN,
AccountPersonalInfo.LastName,
Visit.VisitNumber,
PatientInfo.FirstName,
PatientInfo.LastName,
AccountPersonalInfo.FirstName,
Report.LastSignDate,
Orders.ProcedureDescList,
Visit.Facility,
Orders.CompleteDate,
Orders.FillerOrderNumber
FROM
Comm4.dbo.Order Orders
INNER JOIN
Comm4.dbo.Report Report ON Orders.ReportID=Report.ReportID
INNER JOIN
Comm4.dbo.Visit Visit ON Orders.VisitID=Visit.VisitID
INNER JOIN
Comm4.dbo.PatientInfo PatientInfo ON PatientInfo.PatientID=Visit.PatientID
INNER JOIN
Comm4.dbo.AccountPersonalInfo AccountPersonalInfo ON
Report.SignerAcctID=AccountPersonalInfo.AccountID
WHERE
PatientInfo.MRN<>'TEMPORARY' AND
Report.LastSignDate>={ts '2020-09-01 00:00:00'} AND
Report.LastSignDate<{ts '2020-10-01 00:00:00'}
ORDER BY
Report.LastSignDate, PatientInfo.MRN
"""
cursor.execute(sql)
row = cursor.fetchone()
conn.close()
print(row)
添加回答
舉報