需要保留所有列,但需要获取重复列名称#1060

时间:2016-01-07 17:15:02

标签: python mysql

我正在尝试执行此大型查询。我执行一系列连接,然后从结果关系中我想执行另一个连接并过滤掉某些元组。

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。我该怎么做才能解决这个问题?

1 个答案:

答案 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,其名称可能是唯一的。