【问题标题】:Need to retain all columns but getting Duplicate Column Name #1060需要保留所有列但得到重复的列名 #1060
【发布时间】:2016-01-08 01:48:26
【问题描述】:

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

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。我可以做些什么来解决这个问题?

【问题讨论】:

  • 您必须在子查询中指定表和列。例如。 SELECT * FROM (SELECT Table1.instrument_id,...
  • 但我不可能列出子查询结果中的所有列,我需要所有列
  • dev.mysql.com/doc/refman/5.7/en/from-clause-subqueries.html "子查询选择列表中的任何列都必须具有唯一的名称。"
  • 您可以尝试使用 JOIN ... USING(instrument_id) - 请参阅此处stackoverflow.com/questions/13908249/…。抱歉,我没有时间检查并发布完整答案。
  • 是什么阻止你列出所有的列,你说你不能,或者你的意思是你不想?

标签: python mysql


【解决方案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。或者,您可以保留当前连接,并重命名除一个之外的所有 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,它的名字可能是唯一的。

【讨论】:

  • 这很好,但是通过 select market_instrument.*, exchange_instrument.*, Table1.instrument_id AS renamed_id ... 我仍然可以保留连接中的所有列吗?
  • @JeremyFisher,是的,您可以保留所有列。您有两个选项可以这样做:(1)​​在选择列表中,枚举您正在重命名其列的表的所有列,正如我试图在我的示例中显示的那样,或者(2)add一个新名称的列,正如我在更新答案的末尾显示的那样。
猜你喜欢
  • 2016-11-18
  • 2011-06-16
  • 1970-01-01
  • 2021-09-03
  • 2016-08-02
  • 2016-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多