SQL列为select

时间:2013-03-18 23:33:03

标签: mysql sql sqlite

在SQLite和/或MySQL中,是否可以将列定义为SELECT语句?

与列Book.NumOfPages实际上SELECT COUNT(*) FROM PAGES WHERE BOOK_ID=BOOK.ID一样,因此NumOfPages会自动计算分配给某本书的页数。

请注意,我知道如何在一个选择中获得书籍数量。我想知道是否可以将select语句定义为列的一部分。

2 个答案:

答案 0 :(得分:2)

目前尚不清楚您要实现的目标,但至少有以下选项:

  1. 使用子查询在SELECT语句中定义新列(示例1)
  2. 将外部SELECT中的p.1中描述的查询换行,以便进行连接,分组,计算聚合等等(示例2)
  3. 根据第1页(示例3)
  4. 中描述的查询创建视图
  5. 以相同的方式创建存储过程
  6. 还有一个选项 - 在父表(在您的案例簿中)中创建一个列,并在子表(在您的案例页面中)中使用触发器INSERT,UPDATE,DELETE填充它。这种非规范化方法通常在非常特定的情况下使用(例如,当您需要加速分析查询时)。
  7. 示例1

    SELECT id, `title`, 
           (SELECT COUNT(*)
              FROM pages p 
             WHERE p.book_id = b.id) npages
      FROM books b
    

    输出

    | ID | TITLE | NPAGES |
    -----------------------
    |  1 | book1 |      3 |
    |  2 | book2 |      2 |
    

    <强> MySql SQLFiddle

    <强> SQLLite SQLFiddle

    示例2

    SELECT SUM(npages) total_pages
    FROM (SELECT id, `title`, 
           (SELECT COUNT(*)
              FROM pages p 
             WHERE p.book_id = b.id) npages
      FROM books b) t
    

    示例3:创建视图

    CREATE VIEW vw_books AS
    SELECT id, `title`, 
           (SELECT COUNT(*)
              FROM pages p 
             WHERE p.book_id = b.id) npages
      FROM books b 
    

    示例4:创建SP

    DELIMITER $$
    CREATE PROCEDURE sp_books()
    BEGIN
    SELECT id, `title`, 
           (SELECT COUNT(*)
              FROM pages p 
             WHERE p.book_id = b.id) npages
      FROM books b;
    END$$
    
    DELIMITER ;
    

    并使用它

    CALL sp_books();
    

答案 1 :(得分:1)

我相信这就是你的想法:http://en.wikipedia.org/wiki/View_(database)

数据库视图允许您创建一个“假”表,其中包含对其他表的查询。我知道它适用于MySQL,但我不打算对SQLite作出任何承诺。