sqlite在视图中完全限定字段名

sqlite在视图中完全限定字段名,sqlite,sql-view,Sqlite,Sql View,在通过视图进行查询时,我找不到如何禁用SQLite中字段名的完全限定。(不要嘲笑mtcars,表格命名是其他测试的一个症状…) 设置: sqlite> create table mtcars (id int, mpg real, cyl int, vs int); sqlite> insert into mtcars values (1, 21.0, 6, 0); sqlite> insert into mtcars values (2, 22.8, 4, 1); sqlite

在通过视图进行查询时,我找不到如何禁用SQLite中字段名的完全限定。(不要嘲笑mtcars,表格命名是其他测试的一个症状…)

设置:

sqlite> create table mtcars (id int, mpg real, cyl int, vs int);
sqlite> insert into mtcars values (1, 21.0, 6, 0);
sqlite> insert into mtcars values (2, 22.8, 4, 1);
sqlite> insert into mtcars values (1, 21.4, 6, 1);
sqlite> .headers on
“正常”表访问,无视图:

sqlite> select * from mtcars foo;
id|mpg|cyl|vs
1|21.0|6|0
2|22.8|4|1
1|21.4|6|1
sqlite> select foo.* from mtcars foo;
id|mpg|cyl|vs
1|21.0|6|0
2|22.8|4|1
1|21.4|6|1
sqlite> select foo.mpg,foo.cyl from mtcars foo;
mpg|cyl
21.0|6
22.8|4
21.4|6
目前一切正常。创建和使用视图:

sqlite> create view vwmtcars as select mpg,cyl from mtcars;
sqlite> select * from vwmtcars foo;
mpg|cyl
21.0|6
22.8|4
21.4|6
sqlite> select foo.* from vwmtcars foo;
mpg|cyl
21.0|6
22.8|4
21.4|6
还是正常的。然而:

sqlite> select foo.mpg,foo.cyl from vwmtcars foo;
foo.mpg|foo.cyl
21.0|6
22.8|4
21.4|6
我期待的是
mpg | cyl
,而不是
foo.mpg | foo.cyl

两个问题:

  • 为什么字段名是完全限定的
  • 我可以禁用这个吗

  • (Win10 x64,sqlite3 3.14.2(包括在Git for Windows 2.11.1中))

    一个解决方法就是用别名重置列名:

    select f.mpg as mpg,f.cyl as cyl from vwmtcars f;
    mpg|cyl
    21.0|6
    22.8|4
    21.4|6
    

    一种解决方法是使用别名重置列名:

    select f.mpg as mpg,f.cyl as cyl from vwmtcars f;
    mpg|cyl
    21.0|6
    22.8|4
    21.4|6
    

    进一步解释,以备将来参考

    其中两个相关:
    short\u column\u names
    (当前设置为
    1
    )和
    full\u column\u names
    (当前设置为
    0
    )。两者都不赞成

    根据用于命名返回列的逻辑(在上面的pragma链接中全文转述):

  • 如果有
    AS
    子句,请使用它
  • 如果它是一个表达式,请使用它
  • 如果
    short\u column\u names
    为true,则只使用列名
  • 如果两个
    *\u列\u名称
    均为假,则规则2适用
  • 使用
    TABLE.COLUMN
  • 此安装的事实:

    • pragma compile_options
      没有列出
      省略_DEPRECATED
      ,因此这两个pragma可用且有效(尽管不鼓励使用)
    • short\u column\u names
      为真,
      full\u column\u names
      为假(我都没有更改)
    由此,我推断SQLite将别名视图和列名视为一个表达式,因此在案例2中得到解决,在案例3或更高版本中从不检查pragmas


    我倾向于的解决方案(正如@gregory刚才回答的)是显式地命名每个变量(
    选择foo.mpg作为mpg,foo.cyl作为cyl…
    )。尽管这似乎是在修复症状,而不是逻辑中的潜在缺陷,但它与SQL代码中的一个(众多)最佳实践是一致的:始终是明确的

    进一步解释,以供将来参考

    其中两个相关:
    short\u column\u names
    (当前设置为
    1
    )和
    full\u column\u names
    (当前设置为
    0
    )。两者都不赞成

    根据用于命名返回列的逻辑(在上面的pragma链接中全文转述):

  • 如果有
    AS
    子句,请使用它
  • 如果它是一个表达式,请使用它
  • 如果
    short\u column\u names
    为true,则只使用列名
  • 如果两个
    *\u列\u名称
    均为假,则规则2适用
  • 使用
    TABLE.COLUMN
  • 此安装的事实:

    • pragma compile_options
      没有列出
      省略_DEPRECATED
      ,因此这两个pragma可用且有效(尽管不鼓励使用)
    • short\u column\u names
      为真,
      full\u column\u names
      为假(我都没有更改)
    由此,我推断SQLite将别名视图和列名视为一个表达式,因此在案例2中得到解决,在案例3或更高版本中从不检查pragmas


    我倾向于的解决方案(正如@gregory刚才回答的)是显式地命名每个变量(
    选择foo.mpg作为mpg,foo.cyl作为cyl…
    )。虽然这看起来像是在修复症状,而不是逻辑中的潜在缺陷,但它与SQL代码中的一个(许多)最佳实践是一致的:始终是显式的

    是的,这正是我想到的一个解决方法。我正在起草一个答案,因为我找到了“原因”,如果不是一个更有力的解决办法的话。谢谢回复!似乎这种行为在不断变化:“在不断变化”从2008年开始,慢速对话:-)我看到了一些其他类似的讨论,似乎我看到了类似的行为。也许我只是在重申一个总是直言不讳的“最佳实践”。再次感谢!是的,这正是我想到的一个解决办法。我正在起草一个答案,因为我找到了“原因”,如果不是一个更有力的解决办法的话。谢谢回复!似乎这种行为在不断变化:“在不断变化”从2008年开始,慢速对话:-)我看到了一些其他类似的讨论,似乎我看到了类似的行为。也许我只是在重申一个总是直言不讳的“最佳实践”。再次感谢!