Как отфильтровать результат union_all в SQLAlchemy? - PullRequest
0 голосов
/ 01 сентября 2018

У меня есть две таблицы SQLAlchemy, сгенерированные отражением с использованием SQLAlchemy:

In [356]: t1
Out[356]: Table('t1', MetaData(bind=None), Column('x', INT(), table=<t1>), Column('y', STRING(), table=<t1>), schema=None)

In [357]: t2
Out[357]: Table('t2', MetaData(bind=None), Column('x', INT(), table=<t2>), Column('y', STRING(), table=<t2>), schema=None)

Я хотел бы выполнить операцию union_all, используя две приведенные выше таблицы, а затем отфильтровать результат, чтобы сохранить его только при x > 2. Вот что я сделал:

q1 = select([t1.c.x.label('x'), t1.c.y.label('y')])
q2 = select([t2.c.x.label('x'), t2.c.y.label('y')])
q3 = q1.union_all(q2)
q = select([q3.c.x, q3.c.y]).where(q3.c.x > 2)
conn.execute(q).fetchall()

Но я получил:

DBAPIError: (impala.error.HiveServer2Error) AnalysisException: Syntax error in line 5:
WHERE x > 2
^
Encountered: WHERE
Expected: AS, DEFAULT, IDENTIFIER

CAUSED BY: Exception: Syntax error
 [SQL: 'SELECT x, y \nFROM (SELECT t1.x AS x, t1.y AS y \nFROM t1 UNION ALL SELECT t2.x AS x, t2.y AS y \nFROM t2) \nWHERE x > %(x_1)s'] [parameters: {'x_1': 2}] (Background on this error at: http://sqlalche.me/e/dbapi)

Нашли похожие вопросы здесь и здесь , но все еще без понятия.

1 Ответ

0 голосов
/ 01 сентября 2018

Ваша производная таблица не имеет имени, или, другими словами, в выражении объединения отсутствует псевдоним в предложении FROM. Попробуйте:

q3 = q1.union_all(q2).alias()

, который добавит требуемый AS.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...