Member 10216922 Ответов: 1

Как найти входные данные, отсутствующие в 1 из 3 таблиц


У меня есть 3 таблицы PostedRecipes, PostedRecipePictures и RecipeRatings. PostedRecipes и PostedRecipePictures используют RecipeID в качестве ключа. RecipeRatings использует RatingID в качестве ключа, но имеет RecipeID в качестве имени столбца.

Данные из всех 3-х таблиц объединяются, чтобы представить рецепт (PostedRecipes) с картинкой и рейтингом.

PostedRecipes может иметь данные без каких-либо других данных. Поэтому рецепт может быть просто рецептом, или рецептом с картинкой, или рецептом с картинкой и рейтингом.

PostedRecipePictures и RecipeRatings не требуются для ввода PostedRecipe, однако, если RecipeID вводится либо в PostedRecipePictures, либо в RecipeRatings, ввод должен быть сделан - ни в одном из них нет NULL.

Мне нужно определить, какие PostedRecipes не имеют PostedRecipePictures, или RecipeRatings, или того и другого.

Я определил, какие PostedRecipes имеют PostedRecipePictures, но не могу запросить, какие PostedRecipes не имеют PostedRecipePictures или RecipeRatings.

Любое руководство будет оценено по достоинству. Я попробовал следующие запросы.

Что я уже пробовал:

Выберите PostedRecipes.RecipeID, PostedRecipePictures.RecipeID как Выражение1
Из PostedRecipes INNER JOIN
PostedRecipePictures на PostedRecipes.RecipeID = PostedRecipePictures.RecipeID (дает общее количество общих идентификаторов, но не там, где отсутствуют фотографии)

Выберите PostedRecipes.RecipeID, PostedRecipePictures.RecipeID как Выражение1
Из PostedRecipes INNER JOIN
PostedRecipePictures на PostedRecipes.RecipeID = PostedRecipePictures.RecipeID и PostedRecipes.RecipeID &ЛТ;&ГТ; PostedRecipePictures.RecipeID (который не дает никаких результатов)

Выберите PostedRecipes.RecipeID, PostedRecipePictures.RecipeID как Выражение1
Из PostedRecipes INNER JOIN
PostedRecipePictures на PostedRecipes.RecipeID = PostedRecipePictures.RecipeID и PostedRecipes. RecipeID = PostedRecipePictures.RecipeID (который дает общее количество общих идентификаторов, но не то, что мне нужно)

1 Ответов

Рейтинг:
0

Tomas Takac

Тебе нужно левый присоединяйтесь PostedRecipes на фотографии, или рейтинги для того, чтобы получить результаты, которые вы хотите. Внутреннее соединение выбирает только совпадающие строки, в то время как левое соединение выбирает совпадающие строки или null, если строка слева не имеет совпадения справа.

SELECT PostedRecipes.RecipeID, PostedRecipePictures.RecipeID AS Expr1
FROM PostedRecipes 
LEFT JOIN PostedRecipePictures
    ON PostedRecipes.RecipeID = PostedRecipePictures.RecipeID
WHERE PostedRecipePictures.RecipeID IS NULL

В качестве альтернативы вы можете переписать запрос с помощью NOT EXISTS
SELECT PostedRecipes.RecipeID
FROM PostedRecipes 
WHERE NOT EXISTS (
    SELECT * FROM PostedRecipePictures 
    WHERE PostedRecipePictures.RecipeID = PostedRecipes.RecipeID
)