Справка по SQL в Access - поиск отсутствия данных - PullRequest
2 голосов
/ 15 апреля 2009

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

Пример 1

Это мучительно медленно:

ВЫБРАТЬ * ИЗ Семейства
ГДЕ Families.FamilyID НЕ ВХОДИТ (ВЫБЕРИТЕ FamilyID ИЗ ДЕТЕЙ, ГДЕ Children.Gender = "m")

Пример 2

Это быстрее:

ВЫБРАТЬ * ИЗ Семейства
ГДЕ НЕ СУЩЕСТВУЕТ (ВЫБЕРИТЕ * ОТ ДЕТЕЙ, ГДЕ Children.Gender = "m" И Children.FamilyID = Families.FamilyID)

Пример 3

Это самый быстрый, но я беспокоюсь о том, чтобы инвестировать в него, потому что я не могу найти какую-либо документацию по нему. Я даже не знаю, как это называется. Из-за отсутствия лучшего термина мы назвали его «анонимным запросом».

ВЫБРАТЬ * ИЗ Семейных
LEFT JOIN
[ВЫБРАТЬ * ОТ ДЕТЕЙ, ГДЕ ПОЛ = "m"]. КАК ПсевдонимДети ON Families.FamilyID = AliasChildren.FamilyID
ГДЕ AliasChildren.FamilyID НУЛЬ

Итак, мой вопрос таков:

  1. Как называется эта вещь в примере 3?
  2. Является ли это «основной» функцией Access, которая будет поддерживаться в будущем?
  3. Где я могу найти документацию по это (это может быть проще, если я знаю, как это называется)?

Спасибо!

Ответы [ 3 ]

6 голосов
/ 15 апреля 2009

Пример 3 называется производной таблицей, но вы можете упростить запрос до этого:

SELECT * FROM Families
LEFT JOIN
Children ON Families.FamilyID = Children.FamilyID AND Children.Gender="m"
WHERE Children.FamilyID IS NULL 
4 голосов
/ 15 апреля 2009

Как называется эта вещь в примере 3?
Называется "Derrived table"

Является ли это «основной» функцией Access, которая будет поддерживаться в будущем?
Насколько я знаю, это стандартная функция ANSI SQL, и она широко используется.

Где я могу найти документацию по нему (это может быть проще, если я знаю, как она называется)? Вот статья блога о них

В любом случае, запрос от Митча - ваш лучший выбор:

SELECT *   
FROM Families   
LEFT JOIN Children  
  ON (Families.FamilyID = Children.FamilyID) AND (Children.Gender="m")  
WHERE (Children.FamilyID IS NULL)
0 голосов
/ 15 апреля 2009

Я думаю, вы также можете попробовать что-то вроде этого:

ВЫБРАТЬ * ОТ Семьи ГДЕ Families.FamilyID В ( ВЫБЕРИТЕ Children.FamilyID ОТ детей ГДЕ Children.Gender <> 'м' GROUP BY Children.FamilyID )

...