Создание представления базы данных с логической логикой - PullRequest
3 голосов
/ 14 апреля 2010

Мои навыки поиска в Google подвели меня, и я ни в коем случае не эксперт по базам данных! У меня есть очень простая схема базы данных, которая выглядит следующим образом:

схема базы данных http://bit.ly/adeUVL

properties_id в таблице CANDY - это внешний ключ для id в таблице EXPENSIVE_PROPERTIES. Properties_id устанавливается только , если конфета стоит дорого. Если это дорого, то соответствующие значения в таблице EXPENSIVE_PROPERTIES будут заполнены.

Когда я хочу получить список конфет, я в основном хочу сделать это:

  • запросить все свойства в таблице CANDY, такие как имя и цвет
  • дополнительно получить дорогие свойства, если значение properties_id не равно нулю

Раньше я делал два запроса, но это глупо, так как я должен иметь возможность создать представление, которое объединяет все свойства в одну таблицу и просто оставляет другие поля пустыми, если нет соответствующего идентификатор в таблице EXPENSIVE_PROPERTIES.

Может кто-нибудь сказать мне, как создать это представление в SQLite? Я предполагаю, что это возможно, но не смог понять это из документов :

alt text

Элементы IF NOT EXISTS, похоже, не имеют ничего общего с существованием определенного значения поля.

UPDATE

На вопрос был дан ответ, но одна вещь, которую я нахожу странной, заключается в том, что в некоторых случаях я вижу повторяющиеся записи. Я использую SQLite Administrator, и когда я выполняю оператор CREATE VIEW и просматриваю вкладку результатов, я получаю уникальные записи. Если я просто сделаю инструкцию SELECT, я получу дублирующиеся строки. Если я создаю представление, а затем делаю SELECT * FROM myview; Я также вижу дубликаты строк. Может кто-нибудь пролить некоторый свет на это? Должен ли я создать новый вопрос?

ОБНОВЛЕНИЕ № 2

Не берите в голову, я нашел свою ошибку - у меня было две таблицы после FROM, что вызывает дублирование.

Ответы [ 3 ]

3 голосов
/ 14 апреля 2010

Вы можете использовать LEFT OUTER JOIN для извлечения данных из другой таблицы, которая может не иметь данных для некоторых строк в вашей основной таблице.

create view vCandy as
select c.id, c.name, c.color, c.properties,
 ep.chocolate, ep.gold_foil
from Candy c
left outer join Expensive_Properties ep on c.properties_id = ep.id

IF NOT EXISTS не относится к работе с несуществующими данными. Скорее, это означает, что он создаст представление, если оно еще не существует. Это необходимо для предотвращения ошибок при выполнении оператора более одного раза.

2 голосов
/ 14 апреля 2010

Вы хотите выполнить левое соединение в вашем представлении. Это вернет все из первой таблицы в соединении и все из второй соответствующей таблицы. Если ничего не найдено (конфета не дорогая), поля из второй таблицы будут нулевыми.

выберите * из конфетного левого внешнего соединения.

1 голос
/ 14 апреля 2010

Я не знаком с SQLite, но в противном случае потребуется LEFT OUTER JOIN:

SELECT * FROM candy c
    LEFT OUTER JOIN expensive_properties ep ON c.id = ep.id
WHERE [your criteria]

Это выберет все, что соответствует, и оставит NULL для ep. *, Которые не существуют для таблицы CANDY.

...