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
'programing' 카테고리의 다른 글
AngularJs가 반복 실행을 너무 많이 브로드캐스트합니다. (0) | 2023.04.01 |
---|---|
오류: $digest가 이미 진행 중입니다. (0) | 2023.04.01 |
어제 레코드만 선택하려면 어떻게 해야 하나요? (0) | 2023.03.27 |
json.Marshal(struct)이 "{}"을(를) 반환합니다. (0) | 2023.03.27 |
$.ajax()의 Ajax 요청에 어레이 전달 (0) | 2023.03.27 |