sqlite在视图中完全限定字段名
在通过视图进行查询时,我找不到如何禁用SQLite中字段名的完全限定。(不要嘲笑mtcars,表格命名是其他测试的一个症状…) 设置: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> 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
,因此这两个pragma可用且有效(尽管不鼓励使用)李>省略_DEPRECATED
为真,short\u column\u names
为假(我都没有更改)李>full\u column\u names
我倾向于的解决方案(正如@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
,因此这两个pragma可用且有效(尽管不鼓励使用)李>省略_DEPRECATED
为真,short\u column\u names
为假(我都没有更改)李>full\u column\u names
我倾向于的解决方案(正如@gregory刚才回答的)是显式地命名每个变量(
选择foo.mpg作为mpg,foo.cyl作为cyl…
)。虽然这看起来像是在修复症状,而不是逻辑中的潜在缺陷,但它与SQL代码中的一个(许多)最佳实践是一致的:始终是显式的是的,这正是我想到的一个解决方法。我正在起草一个答案,因为我找到了“原因”,如果不是一个更有力的解决办法的话。谢谢回复!似乎这种行为在不断变化:“在不断变化”从2008年开始,慢速对话:-)我看到了一些其他类似的讨论,似乎我看到了类似的行为。也许我只是在重申一个总是直言不讳的“最佳实践”。再次感谢!是的,这正是我想到的一个解决办法。我正在起草一个答案,因为我找到了“原因”,如果不是一个更有力的解决办法的话。谢谢回复!似乎这种行为在不断变化:“在不断变化”从2008年开始,慢速对话:-)我看到了一些其他类似的讨论,似乎我看到了类似的行为。也许我只是在重申一个总是直言不讳的“最佳实践”。再次感谢!