0

SELECTSQLite および/または MySQL で、列をステートメントとして定義することは可能ですか?

Book.NumOfPagesが実際にはSELECT COUNT(*) FROM PAGES WHERE BOOK_ID=BOOK.IDであるように、NumOfPages は特定の本に割り当てられたページ数を自動的にカウントします。

1回の選択で本の数を取得する方法を知っていることに注意してください。select ステートメントを列の一部として定義できるかどうかを知りたいです。

4

2 に答える 2

2

何を達成しようとしているのかは明確ではありませんが、少なくとも次のオプションがあります。

  1. サブクエリを使用して、SELECT ステートメントで新しい列を定義します (例 1)。
  2. SELECT結合、グループ化、集計の計算などを行うために、p.1 で説明されているクエリをアウターでラップします(例 2)。
  3. p.1 で説明されているクエリに基づいてビューを作成する (例 3)
  4. 同じ方法でストアド プロシージャを作成する
  5. もう 1 つのオプション - 親テーブル (ケースの本) に列を作成し、子テーブル (ケースのページ) にトリガー 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 SQLフィドル

SQLLite SQLフィドル

例 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 に答える