【问题标题】:Parent Query does not see columns of subquery when returning using SELECT *使用 SELECT * 返回时,父查询看不到子查询的列
【发布时间】:2017-08-25 15:46:52
【问题描述】:

我目前正在使用 Oracle SQL developer 学习 SQL。

在编写查询时,我想出了同一个查询的三个不同版本。

SELECT 
  sh.share_id
  FROM shares sh
    LEFT JOIN trades tr
      ON sh.share_id = tr.share_id 
  WHERE trade_id is NULL;

SELECT 
  sr.share_id
  FROM (SELECT sh.share_id, tr.trade_id
      FROM shares sh
    LEFT JOIN trades tr
      ON sh.share_id = tr.share_id) sr
  WHERE sr.trade_id is NULL;

SELECT 
  sr.share_id
  FROM (SELECT *
      FROM shares sh
    LEFT JOIN trades tr
      ON sh.share_id = tr.share_id) sr
  WHERE sr.trade_id is NULL;

前两个查询编译、运行并返回相同的结果集,但是当我尝试运行第三个查询时,第三个查询的第二行出现错误。 "SR"."SHARE_ID":无效标识符。 我知道 SELECT 语句中的 * 选择了所有列,那么为什么会出现此错误?

【问题讨论】:

  • 两个表都有“trade_id”列吗?
  • 只有交易表有“trade_id”列
  • 抱歉,我无意询问trade_id,但“share_id”是在两张桌子上还是其中一张上?
  • 交易表和股票表中都有“share_id”。
  • 第三个查询不知道你想引用哪个share_id。这也是SELECT * 如此糟糕的原因之一。

标签: sql oracle


【解决方案1】:

通过读取您的 cmets,在您的最终查询中,DBMS 不知道将哪个 share_id 用于您的 SELECT sr.share_id。又名您的子查询的 SELECT * 正在抓取两个 share_id 列。您必须执行第二个查询之类的操作。

【讨论】:

  • 哦,我只是注意到如果我在 FROM 中运行子查询,它会在返回表中包含 share_id 和 share_id_1,正如您提到的那样,它会在两个表中获取 share_id。谢谢你的帮助。
【解决方案2】:

问题是select * 正在从两个表中选择所有列,即使是同名的列。所以,你得到了两次share_id。一个简单的解决方法是使用USING:

SELECT sr.share_id
FROM (SELECT *
      FROM shares sh LEFT JOIN
           trades tr
           USING (share_id)
    ) sr
WHERE sr.trade_id is NULL;

当然,这只是修复了对share_id的引用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-30
    • 2016-04-20
    • 1970-01-01
    • 1970-01-01
    • 2018-09-21
    相关资源
    最近更新 更多