2010-04-29 6 views
2

j'avais l'impression que c'est valide syntaxe SQLite:syntaxe sous-requête SQLite/erreur/différence de MySQL

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; 

Mais je suppose que ce n'est pas, parce que SQLite retourne cette erreur:

no such column: p.bill_year

Qu'est-ce mal avec la façon dont je me réfère à p.bill_year?
Oui, je suis positif table payments héberge une colonne bill_year. Suis-je fou ou est-ce juste une syntaxe SQL valide? Cela fonctionnerait en MySQL, n'est-ce pas? Je n'ai aucun autre SQL présent, donc je ne peux pas tester les autres, mais je pensais que SQLite était assez standard.

Répondre

2

Merci, Mark.
Votre requête fonctionne très bien dans 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

Il travaille dans 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; 

J'imagine que cela fonctionnerait dans SQLite aussi. Je suis sûr que quelqu'un ici peut copier & coller ce qui précède pour le vérifier ...

+0

+1 et merci pour le DDL. – bernie

+0

Salut Mark. Je sais que cela fonctionne en MySQL. Mais cela ne fonctionne pas dans SQLite. C'est le problème ... J'utilise SQLite 2, peut-être qu'il y a une différence. – Rudie

1

Je fais des tests pour confirmer que les travaux sous-requêtes liées dosn't sur sqlite2, mais travaille sur sqlite3, et qui semble être un cas. Le problème est que la documentation officielle ne dit rien à ce sujet. Il y a encore une petite possibilité que les sous-requêtes corrélées soient supportées dans sqlite2 sous une syntaxe étrange. C'est tout ce que je peux dire sans entrer dans le code source sqlite2.

+0

Yup. Pas dans SQLite 2. Ne l'utilisez plus. SQLite 3 est génial. – Rudie