我正在尝试执行此大型查询。我执行一系列连接,然后从结果关系中我想执行另一个连接并过滤掉某些元组。
SELECT *
FROM
(
SELECT *
FROM
market_instrument
inner join exchange_instrument
on market_instrument.id = exchange_instrument.instrument_id
inner join Table1 on market_instrument.id = Table1.instrument_id
left join Table2 on market_instrument.id = Table2.instrument_id
left join `options`on market_instrument.id = `options`.instrument_id
left join Table3 on market_instrument.id = Table3.instrument_id
) as R
inner join Table4 on R.instrument_id = Table4.instrument_id
where Table4.fill_timestamp between CURDATE() - INTERVAL 30 DAY AND NOW();
R
是我指的“连接系列”。我想inner join
R Table4
,然后过滤掉过去30天(日期属性为Table4.fill_timestamp
)的结果关系。我正在使用SQLAlchemy,所以我想到以某种方式将R
保存到某个结果关系变量并对其执行单独的查询,但我不知道SQLAlchemy如何处理它,所以我想尝试在整个查询中执行SQL优先。
我不断收到重复列名称“instrument_id”错误。 instrument_id
是除market_instrument
之外的所有表的主键,它们是相同的,但它被称为id
。我该怎么做才能解决这个问题?
答案 0 :(得分:1)
问题是R
包含多个表中的所有列,并且这些表中的多个列都有一个名为“instrument_id”的列。您尚未为任何列名指定别名,因此当您说“R.instrument_id”时,SQL不知道您所指的instrument_id
列。
如果market_instrument
是唯一包含id
列的表格,那么您可以加入R.id
而不是R.instrument_id
。
或者,另一组解决方案涉及为R
中的部分或全部列分配不同的名称。例如,
SELECT
market_instrument.*,
exchange_instrument.*,
Table1.instrument_id AS the_one_true_id,
Table1.another_column,
Table1.yet_another_column,
...
Table2.*,
options.*,
Table3.*
FROM
market_instrument
inner join exchange_instrument
on market_instrument.id = exchange_instrument.instrument_id
inner join Table1 on market_instrument.id = Table1.instrument_id
left join Table2 on market_instrument.id = Table2.instrument_id
left join `options`on market_instrument.id = `options`.instrument_id
left join Table3 on market_instrument.id = Table3.instrument_id
通过上述内容,您可以加入R.the_one_true_id
。或者,您可以保留当前的连接,并重命名除{1}之外的所有instrument_id
列。在使用模式中的完整R
替换VIEW
的上下文中,可能(或可能不)方便。
或者,您的选择列表可以枚举连接中所有表的所有列。这可能是单调乏味的,但是如果你确实需要所有,那么你需要这样做来消除其他重复名称的歧义,其中至少包括其他各种instrument_id
列。然而,提出这样的任务,也许你会发现你并不真正需要它们中的每一个。
作为另一种选择,您可以添加更多列,而不是重命名现有列。例如,
SELECT
*
exchange_instrument.instrumentId AS ei_instrument_id,
Table1.instrument_id AS t1_instrument_id,
Table2.instrument_id AS t2_instrument_id,
options.instrument_id AS op_instrument_id,
Table3.instrument_id AS t3_instrument_id
FROM
...
然后你可以访问R.t1_instrument_id
,其名称可能是唯一的。