2017-02-22 20 views
0

Я не могу найти, как отключить полную квалификацию имен полей в SQLite при запросе через представление. (Не смейтесь mtcars, таблица имен является признаком от других испытаний ...)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.

Два вопроса:

  1. Почему имена полей не полный квалификацию?
  2. Могу ли я отключить это?

(Win10 x64, sqlite3 3.14.2 (как включенные в Git-для-Windows, 2.11.1))

ответ

2

Обойти это просто сбросить имена столбцов с псевдонимами:

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

Да, это точно одно обходное решение, которое я имел в виду. Я разрабатываю ответ, так как я нашел «причину», если не более надежное обходное решение. Спасибо за ответ! – r2evans

+0

Похоже, что это поведение в потоке: http://sqlite.1065341.n5.nabble.com/Aliasing-and-columns-names-td14489.html – gregory

+0

«В потоке» с 2008 года медленный дискурс :-) Я видел несколько другие подобные дискуссии, и кажется, что я наблюдаю подобное поведение. Возможно, я просто подтверждаю «наилучшую практику» всегда быть явным. Еще раз спасибо! – r2evans

1

Далее поясняется, для дальнейшего использования.

Два SQLite's Pragmas актуальны: (в настоящее время установлен в 1) и full_column_names (в настоящее время 0). Оба устарели.

Согласно логике, используемой для обозначения возвращаемых столбцов (перефразировать, полный текст в ссылке прагма выше):

  1. Если есть AS раздел, используйте его.
  2. Если это выражение, используйте его.
  3. Если верно , используйте только название столбца.
  4. Если оба значения *_column_names являются ложными, применяется правило 2.
  5. Использование TABLE.COLUMN

Факты для этой установки:

  • pragma compile_options не перечисляют OMIT_DEPRECATED, так что два псевдокомментарии применимы и в силе (хотя и обескуражен);
  • is true, full_column_names является ложным (я не изменил ни одного);

Исходя из этого, я выводя, что SQLite является обработкой псевдонимов VIEW и имен столбцов в качестве выражения, поэтому разрешается в случае 2 и никогда не проверяя для прагм в случае 3 или за его пределами.

Решение, к которому я склоняюсь (как только он ответил), должен явно указывать каждую переменную (select foo.mpg as mpg, foo.cyl as cyl ...). И хотя это похоже на фиксацию симптома, а не на базовый недостаток в логике, он согласуется с одной (из многих) лучшей практики в SQL-коде: всегда должен быть явным.