【问题标题】:SQLite subquery syntax/error/difference from MySQLSQLite 子查询语法/错误/与 MySQL 的区别
【发布时间】:2010-04-29 20:00:46
【问题描述】:

我的印象是这是有效的 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,因此无法测试其他 SQL,但我认为 SQLite 非常标准。

【问题讨论】:

    标签: sql sqlite subquery


    【解决方案1】:

    谢谢,Mark
    您的查询在 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()
    []
    

    【讨论】:

      【解决方案2】:

      它适用于 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 中工作。我相信这里有人可以复制并粘贴上面的内容来验证它......

      【讨论】:

      • 嗨,马克。我知道它适用于 MySQL。但它在 SQLite 中不起作用。这就是问题所在......我使用的是 SQLite 2,也许有区别。
      【解决方案3】:

      我进行了一些测试以确认相关子查询在 sqlite2 上不起作用,但在 sqlite3 上起作用,这似乎是一种情况。问题是官方文档对此只字未提。 sqlite2 在一些奇怪的语法下支持相关子查询的可能性仍然很小。不用进入 sqlite2 源代码,我能说的就这些了。

      【讨论】:

      • 是的。不在 SQLite 2 中。不要再使用它了。 SQLite 3 很棒。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多