這是我所擁有的:
Pandas資料框架(命名為df)
SQL中的表(命名為sql_table)
- 3個列:c3、c4和c5
SQL中的目標表(名為target_table)
- 5個空列:c1、c2、c3、c4和c5
c1(來自df)可以與c3(來自sql_table)連接
c2(來自df)可以與c4(來自sql_table)連接
來自df的所有記錄都必須顯示出來(意味著一個外連接)
INSERT INTO target_table (c1, c2, c3, c4, c5)
SELECT c1、c2、c3、c4。
CASE WHEN t1.c5 IS NOT NULLTHEN t1.c5
WHEN t2.c5 IS NOT NULL THEN t2.c5
ELSE NULL END AS c5
FROM dataframe as df
LEFT JOIN sql_table AS t1 ON df.c1 = t1.c3
LEFT JOIN sql_table AS t2 ON df.c2 = t2.c4。
我明白這個查詢(和語法)是不正確的,但這是一般的想法。
目前,我在SQL中有3個表:
- temp_target _table
到目前為止,我正在將df(從Python)匯入到temp_target_table(通過sqlchemy),并手動執行連接(在SQL中),并將這些結果插入到target_table。 我希望能夠避免使用temp_target_table。
uj5u.com熱心網友回復:
這是我為解決我的問題所做的事情:
query = ''
INSERT INTO target_table (c1, c2, c3, c4, c5)
SELECT c1、c2、c3、c4。
CASE WHEN t1.c5 IS NOT NULLTHEN t1.c5
WHEN t2.c5 IS NOT NULL THEN t2.c5
ELSE NULL END AS c5
FROM (VALUES (?, ?)) as df (c1, c2)
LEFT JOIN sql_table AS t1 ON df.c1 = t1.c3
LEFT JOIN sql_table AS t2 ON df.c2 = t2.c4。
''/span>
for row in dataframe.itertuples() 。
cursor.execute(query, row.c1, row.c2)
connection.commit()
uj5u.com熱心網友回復:
2016年及以后的SQL Server版本(包括Azure SQL)包括一個OPENJSON函式,它允許我們將類似表格的資料作為JSON來傳遞。將其與pandas的.to_json()方法和一個CTE結合起來,我們可以做這樣的事情:
import pandas as pd
from sqlalchemy import create_engine, text
engine = create_engine(
"mssql pyodbc://scott:tiger^[email protected]/test"/span>
"?driver=ODBC Driver 17 for SQL Server"/span>
)
# server-side table
with engine.begin() as conn:
conn.exec_driver_sql("DROP TABLE IF EXISTS sql_table"/span>)
conn.exec_driver_sql(
"CREATE TABLE sql_table (user_id varchar(50), employee_no varchar(10))"
)
conn.exec_driver_sql(
"INSERT INTO sql_table (user_id, employee_no) VALUES ('gord', '12345')"/span>
)
# dataframe "table" to join
df = pd.DataFrame([("gord", "[email protected]")], columns=["user_id", "email"]
# note: requires SQL Server 2016 or later (including Azure SQL)
sql = ""
WITH df_table as (
SELECT user_id, email
FROM OPENJSON(:df_data)
其中包括 (
user_id varchar(50) '$.user_id',
email varchar(255) '$.email'.
)
)
SELECT st.user_id, st.employee_no, dt.email
FROM sql_table st INNER JOIN df_table dt ON st.user_id = dt.user_id
""
with engine.begin() as conn:
結果 = conn.execute(
text(sql), {"df_data": df.to_json( orient="records")}。
).fetchall()
print(results)
# [('gord', '12345', '[email protected]')]/span>
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/323101.html
標籤:
上一篇:測驗入口處的dotnetdll
