Python SQL, как искать несоответствия в других таблицах? - PullRequest
0 голосов
/ 30 декабря 2018

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

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

Я попытался выполнить это с помощью SQL и циклически проходить через них, но так как я хочу только первую строку, которая не соответствует, я не нашелгладкое решение (или довольно хорошее, потому что я новичок).

Я почти уверен, что это можно сделать с помощью SQL.

Таблица 1

Id   Name  Location
1    John  Canada
2    James Brazil
3    Jim   Hungary

Таблица 2 - Распознанные имена

Id   Name
1    John
2    James

Таблица 3 - Распознанные местоположения

Id   Location
1    Brazil
2    Hungary

Поэтому я хочу выбрать из Таблицы 1, где Имя не может найти совпадениев таблице 2 или там, где местоположение не может найти совпадения в таблице 3.

В моем примере сверху результат должен быть Id = 1, так как местоположение не в таблице 3.

Спасибозаранее.

1 Ответ

0 голосов
/ 30 декабря 2018

Вы можете использовать not exists, чтобы выбрать, если какой-либо подзапрос не выбирает строку:

select
  *
from
  Table1 t1
where
  not exists (
    select * from Table2 t2 where t2.`Name` = t1.`Name`
  ) and
  not exists (
    select * from Table3 t3 where t3.`Location` = t1.`Location`
  )
order by
  t1.Id
limit 1

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

select
  /* I select all columns, *, for the example, but in real life scenarios 
     it's always better to explicitly specify which columns you need. */
  *
from
  /* Optionally, you can specify a short or different alias for a table (t1)
     this can be helpful to make your query more readable by allowing you to explicitly
     specify where a column is coming from, without cluttering the query with long names. */
  Table1 t1
where
  /* exists takes a sub-query, which is executed for each row of the main query.
     The expression returns true if the subquery returns a row. 
     With not (not exists), the expression is inversed: true becomes false. */
  not exists (
    /* In MariaDB, backticks can be used to escape identifiers that also are 
       reserved words. You are allowed to use them for any identifier, but
      for reserved word identifiers, they are often necessary. */
    select * from Table2 t2 where t2.`Name` = t1.`Name`
  )
  /* Combine the two subqueries. We only want rows don't have a matching row 
     in sub-query one, and neither in sub-query two. */
  and
  not exists (
    select * from Table3 t3 where t3.`Location` = t1.`Location`
  )
/* Specify _some_ ordering by which you can distinguish 'first' from 'second'. */
order by
  t1.Id
/* Return only 1 row (the first according to the order clause) */
limit 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...