簡體   English   中英

SQLAlchemy Select 來自兩個子查詢的連接

[英]SQLAlchemy Select from Join of two Subqueries

需要幫助將此 SQL 查詢轉換為 SQLAlchemy:

select 
    COALESCE(DATE_1,DATE_2) as DATE_COMPLETE,
    QUESTIONS_CNT,
    ANSWERS_CNT
    from (
        (select DATE as DATE_1,
         count(distinct QUESTIONS) as  QUESTIONS_CNT
            from GUEST_USERS    
                where LOCATION like '%TEXAS%'
                and DATE = '2021-08-08'
                    group by DATE 
        ) temp1
        full join 
        (select DATE as DATE_2,
         count(distinct ANSWERS) as  ANSWERS_CNT
            from USERS 
                where LOCATION like '%TEXAS%'
                and DATE = '2021-08-08'
                    group by DATE 
        ) temp2 
        on temp1.DATE_1=temp2.DATE_2
    )

主要是在努力連接兩個子查詢。 我試過這個(只是為了 SQL 的連接部分):

query1 = db.session.query(
    GUEST_USERS.DATE_WEEK_START.label("DATE_1"),
    func.count(GUEST_USERS.QUESTIONS).label("QUESTIONS_CNT")
).filter(
    GUEST_USERS.LOCATION.like("%TEXAS%"),
    GUEST_USERS.DATE == "2021-08-08"
).group_by(GUEST_USERS.DATE)

query2 = db_session_stg.query(
    USERS.DATE.label("DATE_2"),
    func.count(USERS.ANSWERS).label("ANSWERS_CNT")
).filter(
    USERS.LOCATION.like("%TEXAS%"),
    USERS.DATE == "2021-08-08"
).group_by(USERS.DATE)

sq2 = query2.subquery()

query1_results = query1.join(
        sq2,
        sq2.c.DATE_2 == GUEST_USERS.DATE)
    ).all()

在這個 output 中,我只收到 DATE_1 列和 QUESTIONS_CNT 列。 知道為什么沒有在結果中返回從子查詢中選擇的 output 嗎?

不確定這是否是最好的解決方案,但這就是我讓它工作的方式。 本質上使用 3 個子查詢。

query1 = db.session.query(
    GUEST_USERS.DATE_WEEK_START.label("DATE_1"),
    func.count(GUEST_USERS.QUESTIONS).label("QUESTIONS_CNT")
).filter(
    GUEST_USERS.LOCATION.like("%TEXAS%"),
    GUEST_USERS.DATE == "2021-08-08"
).group_by(GUEST_USERS.DATE)

query2 = db_session_stg.query(
    USERS.DATE.label("DATE_2"),
    func.count(USERS.ANSWERS).label("ANSWERS_CNT")
).filter(
    USERS.LOCATION.like("%TEXAS%"),
    USERS.DATE == "2021-08-08"
).group_by(USERS.DATE)

sq1 = query1.subquery()
sq2 = query2.subquery()

query3 = db.session.query(sq1, sq2).join(
    sq2,
    sq2.c.DATE_2 == sq1.c.DATE_1)
sq3 = query3.subquery()

query4 = db.session.query(
    func.coalesce(
        sq3.c.DATE_1, sq3.c.DATE_2),
    sq3.c.QUESTIONS_CNT,
    sq3.c.ANSWERS_CNT
)
results = query4.all()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM