Синтаксис SQLite подзапрос / ошибка / отличие от MySQL - PullRequest
2 голосов
/ 30 апреля 2010

У меня сложилось впечатление, что это правильный синтаксис SQLite:

SELECT
  *,
  (SELECT amount AS target 
     FROM target_money 
    WHERE start_year <= p.bill_year 
      AND start_month <= p.bill_month 
 ORDER BY start_year ASC, start_month ASC 
    LIMIT 1) AS target
FROM payments AS p;

Но я думаю, что нет, потому что SQLite возвращает эту ошибку:

нет такого столбца: p.bill_year

Что не так с тем, как я называю p.bill_year?
Да, я положительный таблица payments хостов столбец bill_year. Я сумасшедший или это просто правильный синтаксис SQL? Это будет работать в MySQL, не так ли? У меня нет другого SQL-кода, поэтому я не могу тестировать другие, но я думал, что SQLite вполне стандартен.

Ответы [ 3 ]

2 голосов
/ 30 апреля 2010

Спасибо, Марк .
Ваш запрос отлично работает в SQLite:

>>> import sqlite3
>>> conn = sqlite3.connect(':memory:')
>>> c = conn.cursor()

>>> c.execute('CREATE TABLE payments (bill_year INT, bill_month INT);')
<sqlite3.Cursor object at 0x00C62CE0>
>>> conn.commit()

>>> c.execute("""CREATE TABLE target_money 
        (amount INT, start_year INT, start_month INT);""")
<sqlite3.Cursor object at 0x00C62CE0>
>>> conn.commit()

>>> c.execute("""
... SELECT
...   *,
...   (SELECT amount AS target
...    FROM target_money
...    WHERE start_year <= p.bill_year AND start_month <= p.bill_month
...    ORDER BY start_year ASC, start_month ASC
...    LIMIT 1) AS target
... FROM
...   payments AS p;
... """)
<sqlite3.Cursor object at 0x00C62CE0>
>>> c.fetchall()
[]
1 голос
/ 24 марта 2013

Я провожу несколько тестов, чтобы подтвердить, что коррелированные подзапросы не работают на sqlite2, но работают на sqlite3, и, похоже, это так. Проблема в том, что официальная документация ничего не говорит об этом. По-прежнему существует небольшая вероятность того, что коррелированные подзапросы поддерживаются в sqlite2 в нечетном синтаксисе. Это все, что я могу сказать, не вдаваясь в исходный код sqlite2.

1 голос
/ 30 апреля 2010

Работает в MySQL:

CREATE TABLE payments (bill_year INT, bill_month INT);
CREATE TABLE target_money (amount INT, start_year INT, start_month INT);

SELECT
  *,
  (SELECT amount AS target
   FROM target_money
   WHERE start_year <= p.bill_year AND start_month <= p.bill_month
   ORDER BY start_year ASC, start_month ASC
   LIMIT 1) AS target
FROM
  payments AS p;

Я полагаю, что это будет работать и в SQLite. Я уверен, что кто-то здесь может скопировать и вставить вышеупомянутое, чтобы проверить это ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...