Как найти идентификаторы, для которых нет данных из другой таблицы

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

Например, мы хотим убедиться, что у всех есть все три этих предмета.

Таблица 1

item_ID

  • item_1

  • item_2

  • item_3

И у нас есть эта таблица ниже

Таблица 2

ID .. item_ID

  • 1 .. item_1

  • 1 .. item_2

  • 1 .. item_3

  • 2 .. item_1

  • 2 .. item_2

  • 3 .. item_1

И так далее. Вы можете видеть, что ID 2 отсутствует в их таблице item_3, и я хочу вытащить кортеж, который отображает 2, item_3 в запросе.

Пока у меня есть что-то вроде этого

SELECT DISTINCT b.ID, a.item
    FROM TABLE1 a
        LEFT OUTER JOIN TABLE2 b
            ON a.ITEM_ID=b.ITEM_ID
WHERE b.ITEM_ID is NULL

Я пытался написать что-то, где я могу вытащить item_ID, некоторые идентификаторы отсутствуют, но пока ничего не работает.

Ссылается ли table2.ID на другую таблицу?

Uueerdo 27.04.2018 19:55

Если я хорошо понимаю, вы пытаетесь получить данные из таблицы 1, где идентификаторы элементов отсутствуют в таблице 2, и связать каждый из них с правильным идентификатором в таблице 2. Может быть, мне нужна дополнительная информация, но поиск отсутствующих идентификаторов элементов в таблице 2 - это довольно просто, но я не могу понять, как вы можете связать отсутствующие идентификаторы элементов с правильным идентификатором в таблице 2 после. Как вы узнаете, что элемент 3 связан с идентификатором 2 в таблице 2 в качестве примера? Чтобы сделать запрос, вы должны сначала ответить на этот вопрос.

Hexxefir 27.04.2018 20:03

Привет. Что означает «нет определенных данных в их таблице»? В каких случаях в идентификаторе «отсутствуют» некоторые данные? Когда в нем нет строки со значением из таблицы 1? Вы четко не объясняете, что хотите, и не показываете пример ввода с желаемым результатом. Вы просто даете запрос неправильный. Прочтите и действуйте в соответствии с минимальный воспроизводимый пример.

philipxy 28.04.2018 05:04
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
1
3
47
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Если у вас есть полный список идентификаторов в таблице 2, вы можете использовать его, но если у вас его нет, вы можете использовать это:

SELECT ft.* 
FROM TABLE2 t2 RIGHT OUTER JOIN
(SELECT b.ID, a.ITEM_ID
  FROM TABLE1 a
    CROSS JOIN (SELECT DISTINCT ID FROM TABLE2) b) ft
      ON t2.id = ft.id AND t2.item_id = ft.item_id
WHERE t2.id IS NULL

http://sqlfiddle.com/#!9/2d0a19/7

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

OP, возможно, захочет принять к сведению, что никто никогда не использует RIGHT JOIN - альтернатива, которая обычно считается более простой для понимания людьми: sqlfiddle.com/#!9/2d0a19/8

Strawberry 28.04.2018 05:27
Ответ принят как подходящий
SELECT a.ID, b.item_id
FROM (SELECT DISTINCT ID FROM Table2) AS a 
-- or TableX AS a -- if you have a TableX with the unique ID values used for Table2 
CROSS JOIN Table1 AS b
-- or (SELECT DISTINCT item_id FROM Table2) AS b -- if Table1 was not available
LEFT JOIN Table2 AS c ON a.ID = c.ID AND b.item_id = c.item_id
WHERE c.ID IS NULL
;

Разве в строке 6 не будет b.item_id вместо a.item_id?

Matthew I 27.04.2018 20:51

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

philipxy 29.04.2018 10:32

Другие вопросы по теме