2013-03-18 3 views
0

В SQLite и/или MySQL можно определить столбец как оператор SELECT?SQL-столбец по выбору

Как и в столбце Book.NumOfPages, на самом деле SELECT COUNT(*) FROM PAGES WHERE BOOK_ID=BOOK.ID, поэтому NumOfPages автоматически подсчитывает количество страниц, назначенных определенной книге.

Обратите внимание, что я знаю, как получить количество книг в течение одного выбора. Я хочу знать, можно ли определить оператор select как часть столбца.

ответ

2

Это не ясно, что вы пытаетесь достичь, но, по крайней мере, следующих параметры:

  1. Используйте подзапрос, чтобы определить свой новый столбец в вашем ЗЕЬЕСТЕ (пример 1)
  2. Wrap запроса описанный в ч.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 Создание СП

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 всегда выбирает что-то)? –

+0

См. Обновленный ответ. У вас есть несколько вариантов. Что использовать, зависит от того, зачем вам это нужно. – peterm

+0

И еще один вариант – peterm

1

Я считаю, что это то, что вы думаете: http://en.wikipedia.org/wiki/View_(database)

Представление базы данных позволяет сделать «фальшивый» таблицу, которая состоит из запросов на другие таблицы. Я знаю, что он работает в MySQL, хотя я не собираюсь делать никаких обещаний о SQLite.

+0

Так ты предлагаешь "скрывается" фактический Книжный стол и доступ петь это vi? a View? –

+0

Не так быстро. Сначала убедитесь, что вид - это то, что вы ищете. В вашем примере NumberOfPages будет столбцом представления, а не какой-либо таблицы. –