2013-03-18 127 views
0

在SQLite和/或MySQL中,是否可以將列定義爲SELECT語句?SQL列作爲選擇

與列Book.NumOfPages一樣,實際上是SELECT COUNT(*) FROM PAGES WHERE BOOK_ID=BOOK.ID,因此NumOfPages會自動計算分配給某本書的頁數。

請注意,我知道如何獲得一個選擇內的書籍數量。我想知道是否可以將select語句定義爲列的一部分。

回答

2

目前尚不清楚你想要達到的,但你至少有以下選項:

  1. 使用子查詢在SELECT語句來定義新的列(例如1)
  2. 包裹查詢(示例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(); 
+0

這不是我問的。我可以直接將它們寫入表中,因此列NumOfPages是查詢的別名(即調用NumOfPages總是選擇一些內容)? – 2013-03-19 00:05:05

+0

查看更新的答案。你有幾個選擇。使用什麼取決於你爲什麼需要它。 – peterm 2013-03-19 00:31:52

+0

還有一個選項 – peterm 2013-03-19 00:39:44

1

我相信這是你在想什麼:http://en.wikipedia.org/wiki/View_(database)

數據庫視圖,可以做一個「假」表由查詢其他表。我知道它適用於MySQL,但我不會對SQLite做出任何承諾。

+0

所以你建議 「藏」實際的書桌和訪問唱它viá一個視圖? – 2013-03-18 23:39:56

+0

沒那麼快。首先確保你正在尋找一個視圖。在你的例子中,NumberOfPages將是視圖的一列,而不是任何表。 – 2013-03-18 23:47:05