2012-03-27 2 views
1

サブクエリーテーブルの列である兄弟列を参照するスカラーサブクエリー列を作成するクエリを作成しようとしています。私が試みていることの単純な例をまとめましたが、私が実際にこれをどのように使っているかはもう少し精巧です。以下のように見えるSQL生成SQLAlchemy外部サブクエリーテーブルからの列との比較でスカラーサブクエリー列を作成

Session = sessionmaker(bind=engine) 
session = Session() 

Base = declarative_base() 

class A(Base): 
    __tablename__ = "TestA" 
    id = Column('id', Integer, primary_key=True) 
    name = Column('name', String).label('name') 
    metric = Column('metric', Integer).label('metric') 
    increment_day = Column('increment_day', Date).label('increment_day') 

class B(Base): 
    __tablename__ = "TestB" 
    id = Column('id', Integer, primary_key=True) 
    name = Column('name', String).label('name') 
    metric = Column('metric', Integer).label('metric') 
    increment_day = Column('increment_day', Date).label('increment_day') 

class C(Base): 
    __tablename__ = "TestC" 
    c_id = Column('c_id', Integer, primary_key=True) 
    c_metric = Column('c_metric', Integer) 
    c_increment_day = Column('c_increment_day', Date) 

a_query = session.query(*[A.id, A.name, A.metric, A.increment_day,]).filter(A.increment_day=='2012-01-01') 
b_query = session.query(*[B.id, B.name, B.metric, B.increment_day,]).filter(B.increment_day=='2012-01-02') 
inner_query = a_query.union_all(b_query).subquery('res') 
outer_query = session.query(*[inner_query.c.increment_day, 
           func.sum(inner_query.c.metric)]) 
c_select = session.query(*[func.sum(C.c_metric),])\ 
        .filter(C.c_increment_day==inner_query.c.increment_day) 
outer_query = outer_query.add_column(c_select.as_scalar()) 

:私はセットアップ私のクエリはように「RES」サブクエリは、スカラー列のクエリで繰り返されていないことができる方法

SELECT res.increment_day 
    , sum(res.metric) AS sum_1 
    , (SELECT sum(`TestC`.c_metric) AS sum_2 
      FROM `TestC`, 
       , (SELECT anon_2.name AS name 
         , anon_2.metric AS metric 
         , anon_2.increment_day AS increment_day 
        FROM (SELECT `TestA`.id AS `TestA_id` 
           , name AS name 
           , metric AS metric 
           , increment_day AS increment_day 
          FROM `TestA` 
          WHERE increment_day = '2012-01-01' 
          UNION ALL 
          SELECT `TestB`.id AS `TestB_id` 
           , name AS name 
           , metric AS metric 
           , increment_day AS increment_day 
          FROM `TestB` 
          WHERE increment_day = '2012-01-02' 
         ) AS anon_2 
       ) AS res 
      WHERE `TestC`.c_increment_day = res.increment_day 
     ) AS anon_1 
    FROM (SELECT anon_2.name AS name 
       , anon_2.metric AS metric 
       , anon_2.increment_day AS increment_day 
      FROM (SELECT `TestA`.id AS `TestA_id` 
         , name AS name 
         , metric AS metric 
         , increment_day AS increment_day 
        FROM `TestA` 
        WHERE increment_day = '2012-01-01' 
        UNION ALL 
        SELECT `TestB`.id AS `TestB_id`, 
         , name AS name 
         , metric AS metric 
         , increment_day AS increment_day 
        FROM `TestB` 
        WHERE increment_day = '2012-01-02' 
       ) AS anon_2 
     ) AS res 

私の質問ですが、そのようにクエリ代わりに、次のようになります。0.8まで

SELECT res.increment_day 
    , sum(res.metric) AS sum_1 
    , (SELECT sum(`TestC`.c_metric) AS sum_2 
      FROM `TestC` 
      WHERE `TestC`.c_increment_day = res.increment_day 
     ) AS anon_1 
    FROM (SELECT anon_2.name AS name 
       , anon_2.metric AS metric 
       , anon_2.increment_day AS increment_day 
      FROM (SELECT `TestA`.id AS `TestA_id` 
         , name AS name 
         , metric AS metric 
         , increment_day AS increment_day 
        FROM `TestA` 
        WHERE increment_day = '2012-01-01' 
        UNION ALL 
        SELECT `TestB`.id AS `TestB_id`, 
         , name AS name 
         , metric AS metric 
         , increment_day AS increment_day 
        FROM `TestB` 
        WHERE increment_day = '2012-01-02' 
       ) AS anon_2 
     ) AS res 

答えて

2

、あなたはそれの外のSELECT文に相関したいのかについて明示的にクエリを指示する必要があります:

c_select = session.query(*[func.sum(C.c_metric),])\ 
        .filter(C.c_increment_day==inner_query.c.increment_day).correlate(inner_query) 
+1

助けてくれてありがとう...それを修正しました。そして、PyConのSQLAlchemyの講演の功績。 – kyleder

関連する問題