【问题标题】:Nested SELECT "works" when using nonexistant column - why?使用不存在的列时嵌套的 SELECT “有效” - 为什么?
【发布时间】:2019-05-31 10:09:53
【问题描述】:

伙计们,我在 SQLite 中有以下查询:

select license, username from check_table where
(
    username not in (
        select username from Address
    )
) order by license, username;

Address 是另一个表。有趣的是:Address 没有usernamecolumn!!

详情:

  • 结果:Query finished in 0.004 second(s)
  • 如果我修改 username 部分(例如修改为 userrname),我会收到 no such column 错误,这完全没问题
  • 它永远不会返回任何结果,即使我在子选择中将 username 替换为 mail_username(实际上存在) - 这完全奇怪,因为它确实应该这样做。

现在,我的问题是:为什么我在这里没有收到错误消息?!这是否与我从未得到任何结果的事实有关?

【问题讨论】:

  • 我无法想象这实际上是可重现的。在命令行上运行SELECT username FROM Address 会发生什么?这会返回任何内容或给出错误吗?
  • 此代码也适用于 MySql、SQL Server、Postgresql 等。username 是来自check_table 的列
  • check_table 有该列,并且没有明确告诉解析器它应该使用哪个表来搜索从最本地的列,这里是 address,到最全局的,这里是 check_table,然后瞧,在check_table 中找到一列username。规避像<table name or alias>.<column name>这样的明确限定列。

标签: sql sqlite


【解决方案1】:

您从check_table 中选择username,而不是从address 表中选择。

尝试添加别名并检查一下:

select ct.license, ct.username 
from check_table as ct
where
(
    ct.username not in (
        select ct.username 
        from Address as a
    )
) order by ct.license, ct.username;

我敢打赌,如果您尝试使用select a.username...,您会收到关于不存在列的错误。

为此,当您在查询中使用多个表时,最好使用别名。

【讨论】:

  • 就是这样:)。我不知道 SQL 中的查找规则。也不了解用例 - 但我也是 SQL 菜鸟 ;) 。谢谢!
  • 真正烦人的是——它仍然没有返回任何结果。但是当我这样做时:select ct.username, a.mail_username from check_table as ct left join Address as a 我在右侧得到了很多 NULLs。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-11
  • 1970-01-01
  • 2010-11-04
  • 1970-01-01
  • 1970-01-01
  • 2015-03-21
相关资源
最近更新 更多