python sqlite3 не выполнит объединение, но только sqlite3 выполнит - PullRequest
3 голосов
/ 31 мая 2010

Используя стандартную библиотеку sqlite3 в Python 2.6.4, следующий запрос отлично работает в командной строке sqlite3:

select segmentid, node_t, start, number,title  from 
    ((segments inner join position using (segmentid)) 
    left outer join titles using (legid, segmentid)) 
    left outer join numbers using (start, legid, version);

Но если я выполняю его через библиотеку sqlite3 в python, я получаю сообщение об ошибке:

>>> conn=sqlite3.connect('data/test.db')
>>> conn.execute('''select segmentid, node_t, start, number,title  from 
((segments inner join position using (segmentid)) left outer join titles using 
(legid, segmentid)) left outer join numbers using (start, legid, version)''')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
sqlite3.OperationalError: cannot join using column start - column not present 
in both tables

(Вычисляемая) таблица в левой части объединения, кажется, имеет соответствующий столбец, потому что, если я проверю ее сам, я получу:

>>> conn.execute('''select *  from ((segments inner join position using 
(segmentid)) left outer join titles using 
(legid, segmentid)) limit 20''').description
(('segmentid', None, None, None, None, None, None), ('html', None, None, None, 
None, None, None), ('node_t', None, None, None, None, None, None), ('legid', 
None, None, None, None, None, None), ('version', None, None, None, None, None, 
None), ('start', None, None, None, None, None, None), ('title', None, None, 
None, None, None, None))

Моя схема:

CREATE TABLE leg (legid integer primary key,  t char(16), year char(16), 
    no char(16));
CREATE TABLE numbers (
    number char(16), legid integer, version integer, start integer, 
    end integer, prev integer, prev_number char(16), next integer, 
    next_number char(16), primary key (number, legid, version));
CREATE TABLE position (
    segmentid integer, legid integer, version integer, start integer, 
    primary key (segmentid, legid, version));
CREATE TABLE 'segments' 
    (segmentid integer primary key,  html text, node_t integer);
CREATE TABLE titles (legid integer, segmentid integer, title text, 
    primary key (legid, segmentid));
CREATE TABLE versions 
    (legid integer, version integer, primary key (legid, version));
CREATE INDEX idx_numbers_start on numbers (legid, version, start);

Я озадачен тем, что я делаю неправильно. Я попытался выйти / перезапустить командную строку python и sqlite и не вижу, что я делаю неправильно. Это может быть совершенно очевидно.

Ответы [ 3 ]

1 голос
/ 02 июня 2010

Решение (для моей проблемы с использованием библиотеки python), по-видимому, состоит в том, чтобы ввести полностью ложное имя таблицы:

SELECT legid, version, segmentid, html, node_t, start, number, title 
    from ((segments inner join position using (segmentid))  
    left outer join titles using (legid, segmentid)) as LT 
    left outer join numbers using (start, legid, version);

То, что я думаю, это то, что заставляет sqlite собирать вместе имена левой стороны самого внешнего внешнего объединения, одно из которых - «начало», а затем это дает что-то, для того, чтобы работать с внешним внешним соединением. Это работает для меня - возможно, что обновление принесет больше проблем, чем уберет их, но я перейду этот мост, когда он прибудет.

0 голосов
/ 01 июня 2010

SQLite версии 3.6.22 - похоже, вам нужно квалифицировать «неоднозначные имена столбцов» ...

sqlite> select segmentid, node_t, start, number,title  from
   ...> ((segments inner join position using (segmentid))
   ...> left outer join titles using (legid, segmentid))
   ...> left outer join numbers using (start, legid, version);
Error: ambiguous column name: segmentid

sqlite> select segments.segmentid, node_t, start, number,title  from
   ...> ((segments inner join position using (segmentid))
   ...> left outer join titles using (legid, segmentid))
   ...> left outer join numbers using (start, legid, version);
Error: ambiguous column name: start

sqlite> select segments.segmentid, node_t, numbers.start, number,title  from
   ...> ((segments inner join position using (segmentid))
   ...> left outer join titles using (legid, segmentid))
   ...> left outer join numbers using (start, legid, version);
sqlite> 

Поведение аналогично с SQLite версии 3.6.23.1

0 голосов
/ 31 мая 2010

У вас есть таблица со смешным именем:

CREATE TABLE 'segments' 

Но я не думаю, что это проблема. Для каждого запроса, вот мое выполнение вашего запроса с таблицей 'segments', воссозданной как segments:

$ sqlite3 junk.sqlite
SQLite version 3.6.22
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> .schema
CREATE TABLE leg (legid integer primary key,  t char(16), year char(16), 
    no char(16));
CREATE TABLE numbers (
    number char(16), legid integer, version integer, start integer, 
    end integer, prev integer, prev_number char(16), next integer, 
    next_number char(16), primary key (number, legid, version));
CREATE TABLE position (
    segmentid integer, legid integer, version integer, start integer, 
    primary key (segmentid, legid, version));
CREATE TABLE segments (segmentid integer primary key,  html text, node_t integer);
CREATE TABLE titles (legid integer, segmentid integer, title text, 
    primary key (legid, segmentid));
CREATE TABLE versions 
    (legid integer, version integer, primary key (legid, version));
CREATE INDEX idx_numbers_start on numbers (legid, version, start);
sqlite> select segmentid, node_t, start, number,title  from 
   ...>     ((segments inner join position using (segmentid)) 
   ...>     left outer join titles using (legid, segmentid)) 
   ...>     left outer join numbers using (start, legid, version);
Error: ambiguous column name: segmentid
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...