[SQL] IN 절에서 SQL 여러 열
SQLIN 절에서 SQL 여러 열
우리는 주어진 열 값의 일부 집합을 기준으로 테이블을 조회해야하는 경우, 우리는 단순히 IN 절을 사용할 수 있습니다.
쿼리의 필요성이 여러 열을 기반으로 수행 할 경우, 우리는 절에서 사용할 수 없습니다 (SO 스레드에서 grepped.)
다른 SO 스레드에서, 우리가 조인 절 등이 존재하여이 문제를 회피 할 수 있습니다하지만 모든 일 경우 모두 기본 테이블 및 검색 데이터가 데이터베이스에 있습니다.
E.g
User table:
firstName, lastName, City
(이름, 성) 튜플의 목록을 감안할 때, 나는 도시를 얻을 필요가있다.
나는 다음과 같은 솔루션을 생각할 수 있습니다.
같은 선택 쿼리를 구축
SELECT city from user where (firstName=x and lastName=y) or (firstName=a and lastName=b) or .....
준비 테이블에 모든 이름, 성 값을 업로드하고는 '사용자'테이블과 새로운 준비 테이블 사이에 조인을 수행합니다.
이 문제를 해결하고는 일반적으로이 문제를 해결 무엇을 선호에 대한 옵션이 있습니까?
해결법
-
==============================
1.당신은 다음과 같이 할 수있다 :
당신은 다음과 같이 할 수있다 :
SELECT city FROM user WHERE (firstName, lastName) IN (('a', 'b'), ('c', 'd'));
sqlfiddle
-
==============================
2.그것은 종종 빠른 쿼리를 실행하는 경우에만 경우에도, 데이터베이스에 데이터를로드 할 쉽게 될 수있을 테니까요. 데이터 입력 빠른 것 같다 하드 코딩,하지만 당신은 변경할 필요가 시작하면 신속 고통이된다.
그것은 종종 빠른 쿼리를 실행하는 경우에만 경우에도, 데이터베이스에 데이터를로드 할 쉽게 될 수있을 테니까요. 데이터 입력 빠른 것 같다 하드 코딩,하지만 당신은 변경할 필요가 시작하면 신속 고통이된다.
당신이 당신의 쿼리에 직접 이름을 코드하려는 경우, 여기에 그것을 할 수있는 청소기 방법입니다 :
with names (fname,lname) as ( values ('John','Smith'), ('Mary','Jones') ) select city from user inner join names on fname=firstName and lname=lastName;
이것의 장점은 다소 쿼리에서 데이터를 분리하는 것입니다.
(이것은 DB2 구문이며 그것은 시스템의 조정이 조금 필요할 수 있습니다).
-
==============================
3.오라클에서는이 작업을 수행 할 수 있습니다
오라클에서는이 작업을 수행 할 수 있습니다
SELECT * FROM table1 WHERE (col_a,col_b) IN (SELECT col_x,col_y FROM table2)
-
==============================
4.일반적으로 당신은 쉽게이 같은 경우-조건을 작성할 수 있습니다 :
일반적으로 당신은 쉽게이 같은 경우-조건을 작성할 수 있습니다 :
select * from tab1 where (col1, col2) in (select col1, col2 from tab2)
노트 선택한 열 중 하나 이상이 NULL입니다 오라클은 행을 무시합니다. 이 경우 당신은 아마 (그 값에 있으면 안) 특별한 값으로 NULL을 매핑 할 NVL-Funktion의 사용을 만들고 싶어 :
select * from tab1 where (col1, NVL(col2, '---') in (select col1, NVL(col2, '---') from tab2)
오라클 SQL
-
==============================
5.이건 정말 모두에서 성능에 미치는 영향의 정도가되지 않습니다 당신이 당신의 이름 및 성 컬럼에 인덱스를 확인하고 1과 함께 할 것입니다.
이건 정말 모두에서 성능에 미치는 영향의 정도가되지 않습니다 당신이 당신의 이름 및 성 컬럼에 인덱스를 확인하고 1과 함께 할 것입니다.
편집 : 계획 캐시를 스팸에 대한 @Dems 코멘트 후, 더 나은 솔루션은 따라서 당신과 같은 쿼리를 실행 할 수 있도록하는 연결된 FIRSTNAME + 성 값이 포함 된 기존 테이블에 계산 열 (또는 별도의 뷰)을 만들 수 있습니다
SELECT City FROM User WHERE Fullname in (@fullnames)
@fullnames는 등 " 'JonDoe', 'JaneDoe'"처럼 조금 보이는 곳
-
==============================
6.이름 목록은 각 쿼리 또는 재사용과 차이가 있는지 확인합니다. 이 재사용되는 경우 데이터베이스에 속한다.
이름 목록은 각 쿼리 또는 재사용과 차이가 있는지 확인합니다. 이 재사용되는 경우 데이터베이스에 속한다.
그것은 각 쿼리에 고유하더라도 성능상의 이유로 임시 테이블 (#table 구문)에로드하는 것이 유용 할 수 있습니다 -이 경우 당신은 복잡한 쿼리의 재 컴파일을 방지 할 수 있습니다.
이름의 최대 수는 고정되어있는 경우, 당신은 매개 변수가있는 쿼리를 사용해야합니다.
위의 경우 중 어느 것도 적용되지 않습니다 그러나, 나는 당신의 접근 # 1과 쿼리의 이름을 인라인으로 갈 것입니다.
from https://stackoverflow.com/questions/13027708/sql-multiple-columns-in-in-clause by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] SQL에서 상단 및 제한 키워드의 차이 (0) | 2020.04.14 |
---|---|
[SQL] 오라클은 조인 - 비교를 기존의 구문 VS ANSI 구문 사이 (0) | 2020.04.14 |
[SQL] SQL 서버에서 오라클의 ROWID의 등가 (0) | 2020.04.14 |
[SQL] PHP - MySQL 데이터베이스로 가져 오기 CSV 파일을 사용하여 LOAD DATA INFILE (0) | 2020.04.14 |
[SQL] 어떻게 열로 MySQL의 테이블 행을 바꾸어하기 (0) | 2020.04.14 |