0

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

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

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

4

2 回答 2

2

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

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

示例 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();
于 2013-03-19T00:03:48.497 回答
1

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

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

于 2013-03-18T23:34:41.330 回答