programing

IN 절의 SQL 다중 열

mailnote 2023. 3. 27. 21:26
반응형

IN 절의 SQL 다중 열

특정 컬럼의 값 세트를 기반으로 테이블을 조회해야 할 경우 IN 절을 사용할 수 있습니다.

그러나 여러 열을 기준으로 쿼리를 수행해야 하는 경우 IN 절(SO 스레드에 greped)을 사용할 수 없습니다.

다른 SO 스레드에서는 joins 또는 exists 절 등을 사용하여 이 문제를 회피할 수 있습니다.그러나 메인 테이블과 검색 데이터가 모두 데이터베이스에 있으면 모두 작동합니다.

E.g
User table:
firstName, lastName, City

(이름, 성) 탭 목록이 있으면 도시를 확인해야 합니다.

나는 다음과 같은 해결책을 생각할 수 있다.

1

다음과 같은 선택 쿼리를 구성합니다.

SELECT city from user where (firstName=x and lastName=y) or (firstName=a and lastName=b) or .....

2

모든 firstName, lastName 값을 스테이징 테이블에 업로드하고 'user' 테이블과 새 스테이징 테이블 간에 조인을 수행합니다.

이 문제를 해결할 수 있는 옵션이 있습니까?또한 이 문제를 해결하는 데 있어서 일반적으로 어떤 것이 바람직합니까?

다음과 같이 할 수 있습니다.

SELECT city FROM user WHERE (firstName, lastName) IN (('a', 'b'), ('c', 'd'));

얼간이들.

빠른 쿼리를 실행하는 것이라도 데이터를 데이터베이스에 로드하는 것이 더 쉬워지는 경우가 많습니다.하드 코딩된 데이터는 빠르게 입력할 수 있는 것처럼 보이지만, 변경해야 할 경우 문제가 됩니다.

단, 쿼리에 직접 이름을 코드화하는 경우 보다 깔끔한 방법이 있습니다.

with names (fname,lname) as (
    values
        ('John','Smith'),
        ('Mary','Jones')
)
select city from user
    inner join names on
        fname=firstName and
        lname=lastName;

이 방법의 장점은 쿼리에서 데이터를 분리할 수 있다는 것입니다.

(이것은 DB2 구문입니다.시스템에서 약간의 조정이 필요할 수 있습니다).

Oracle에서는 다음을 수행할 수 있습니다.

SELECT * FROM table1 WHERE (col_a,col_b) IN (SELECT col_x,col_y FROM table2)

일반적으로 Where-Condition은 다음과 같이 쉽게 작성할 수 있습니다.

select * from tab1
where (col1, col2) in (select col1, col2 from tab2)

메모
Oracle은 선택한 열 중 하나 이상이 NULL인 행을 무시합니다. 이 경우 NVL-Funktion을 사용하여 NULL을 특수 값(값에는 없어야 함)에 매핑할 수 있습니다.

select * from tab1
where (col1, NVL(col2, '---') in (select col1, NVL(col2, '---') from tab2)

이름 및 성 열에 인덱스가 있는지 확인하고 1을 선택하십시오.이것은 퍼포먼스에 큰 영향을 주지 않습니다.

편집: 계획 캐시의 스팸화에 관한 @Dems 코멘트 후 더 나은 해결책은 연결된 Firstname + Lastname 값이 포함된 기존 테이블(또는 다른 뷰)에 계산 열을 생성하여 다음과 같은 쿼리를 실행하는 것입니다.

SELECT City 
FROM User 
WHERE Fullname in (@fullnames)

어디에@fullnames약간 닮아 있다"'JonDoe', 'JaneDoe'"

이름 목록이 각 쿼리에 따라 다른지 또는 재사용되는지를 확인합니다.재사용될 경우 데이터베이스에 속합니다.

쿼리에 이 될 수 .#table퍼포먼스상의 이유로 - 이 경우 복잡한 쿼리의 재컴파일을 회피할 수 있습니다.

최대 이름 수가 고정된 경우 매개 변수화된 쿼리를 사용해야 합니다.

단, 위의 케이스 중 어느 것도 해당되지 않는 경우, 저는 당신의 접근법 #1과 같이 쿼리에 이름을 삽입하는 것으로 하겠습니다.

언급URL : https://stackoverflow.com/questions/13027708/sql-multiple-columns-in-in-clause

반응형