2013-08-27 63 views
13

Tôi có truy vấn SQL follwing (Nó được là lớn nhất của một cột nhất định cho mỗi nhóm, với 3 điều cần nhóm bằng):Tham gia vào một subquery trong SQLAlchemy

select p1.Name, p1.nvr, p1.Arch, d1.repo, p1.Date 
from Packages as p1 inner join 
    Distribution as d1 
    on p1.rpm_id = d1.rpm_id inner join (
     select Name, Arch, repo, max(Date) as Date 
     from Packages inner join Distribution 
      on Packages.rpm_id = Distribution.rpm_id 
     where Name like 'p%' and repo not like '%staging' 
     group by Name, Arch, repo 
    ) as sq 
    on p1.Name = sq.Name and p1.Arch = sq.Arch and d1.repo = sq.repo and p1.Date = sq.Date 
    order by p1.nvr 

Và tôi đang cố gắng để chuyển đổi nó đến SQLAlchemy. Đây là những gì tôi có cho đến thời điểm này:

p1 = aliased(Packages) 
d1 = aliased(Distribution) 
sq = session.\ 
     query(
      Packages.Name, 
      Packages.Arch, 
      Distribution.repo, 
      func.max(Packages.Date).\ 
             label('Date')).\ 
     select_from(
      Packages).\ 
     join(
      Distribution).\ 
     filter(
      queryfilter).\ 
     filter(
      not_(Distribution.repo.\ 
            like('%staging'))).\ 
     group_by(
      Packages.Name, 
      Packages.Arch, 
      Distribution.repo).subquery() 

result = session.\ 
      query(
       p1, d1.repo).\ 
      select_from(
       p1).\ 
      join(
       d1).\ 
      join(
       sq, 
       p1.Name==sq.c.Name, 
       p1.Arch==sq.c.Arch, 
       d1.repo==sq.c.repo, 
       p1.Date==sq.c.Date).\ 
      order_by(p1.nvr).all() 

Sự cố phát sinh khi tôi tham gia vào truy vấn phụ. Tôi nhận được một lỗi mà nói rằng không có từ khoản để tham gia từ. Điều này là lạ bởi vì tôi chỉ định một quyền sau khi truy vấn con trong tham gia funciton làm đối số. Bất kỳ ý tưởng những gì tôi đang làm sai? Có lẽ tôi cần phải bí danh một cái gì đó và làm một select_from một lần nữa?

EDIT: lỗi chính xác

Could not find a FROM clause to join from. Tried joining to SELECT "Packages"."Name", "Packages"."Arch", "Distribution".repo, max("Packages"."Date") AS "Date" FROM "Packages" JOIN "Distribution" ON "Packages".rpm_id = "Distribution".rpm_id WHERE "Packages"."Name" LIKE :Name_1 AND "Distribution".repo NOT LIKE :repo_1 GROUP BY "Packages"."Name", "Packages"."Arch", "Distribution".repo, but got: Can't find any foreign key relationships between 'Join object on %(139953254400272 Packages)s(139953254400272) and %(139953256322768 Distribution)s(139953256322768)' and '%(139953257005520 anon)s'. 

Nó cố gắng tham gia, nhưng nó nói nó không biết nơi nào để làm cho tham gia. Có gì sai với cú pháp của tôi không? Tôi nghĩ nó chính xác dựa trên những gì trong hàm nối.

+0

Cố gắng đặt bí danh truy vấn phụ và cũng cố gắng làm việc với các điều kiện kết hợp theo nghĩa đen. Bạn có thể cần hết hạn một chút ở đây. – javex

+0

Tôi có thể sử dụng điều kiện tham gia theo nghĩa đen như thế nào? Ý bạn là như thế nào. Tôi cũng đã cập nhật bài đăng của mình với lỗi cụ thể. – miscsubbin

Trả lời

11

Dường như bạn cần thêm and_() xung quanh nhiều điều kiện tham gia.

join(
    sq, 
    and_(p1.Name==sq.c.Name, 
    p1.Arch==sq.c.Arch, 
    d1.repo==sq.c.repo, 
    p1.Date==sq.c.Date)).\ 
Các vấn đề liên quan