sourcecode

Python SQL 다른 테이블에서 일치하지 않는 항목을 찾는 방법

copyscript 2022. 9. 18. 10:09
반응형

Python SQL 다른 테이블에서 일치하지 않는 항목을 찾는 방법

다른 테이블의 불일치를 확인할 수 있도록 해결책을 찾고 있습니다.

기본적으로 테이블은 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에서 Name이 표 2에서 일치하는 것을 찾을 수 없거나 Location이 표 3에서 일치하는 것을 찾을 수 없는 것을 선택합니다.

위의 예에서는 위치가 표 3에 없기 때문에 결과는 ID = 1이어야 합니다.

잘 부탁드립니다.

사용할 수 있습니다.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

언급URL : https://stackoverflow.com/questions/53976944/python-sql-how-to-look-for-non-matches-in-other-tables

반응형