복붙노트

[SQL] IN 절에서 SQL 여러 열

SQL

IN 절에서 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. ==============================

    1.당신은 다음과 같이 할 수있다 :

    당신은 다음과 같이 할 수있다 :

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

    sqlfiddle

  2. ==============================

    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. ==============================

    3.오라클에서는이 작업을 수행 할 수 있습니다

    오라클에서는이 작업을 수행 할 수 있습니다

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

    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. ==============================

    5.이건 정말 모두에서 성능에 미치는 영향의 정도가되지 않습니다 당신이 당신의 이름 및 성 컬럼에 인덱스를 확인하고 1과 함께 할 것입니다.

    이건 정말 모두에서 성능에 미치는 영향의 정도가되지 않습니다 당신이 당신의 이름 및 성 컬럼에 인덱스를 확인하고 1과 함께 할 것입니다.

    편집 : 계획 캐시를 스팸에 대한 @Dems 코멘트 후, 더 나은 솔루션은 따라서 당신과 같은 쿼리를 실행 할 수 있도록하는 연결된 FIRSTNAME + 성 값이 포함 된 기존 테이블에 계산 열 (또는 별도의 뷰)을 만들 수 있습니다

    SELECT City 
    FROM User 
    WHERE Fullname in (@fullnames)
    

    @fullnames는 등 " 'JonDoe', 'JaneDoe'"처럼 조금 보이는 곳

  6. ==============================

    6.이름 목록은 각 쿼리 또는 재사용과 차이가 있는지 확인합니다. 이 재사용되는 경우 데이터베이스에 속한다.

    이름 목록은 각 쿼리 또는 재사용과 차이가 있는지 확인합니다. 이 재사용되는 경우 데이터베이스에 속한다.

    그것은 각 쿼리에 고유하더라도 성능상의 이유로 임시 테이블 (#table 구문)에로드하는 것이 유용 할 수 있습니다 -이 경우 당신은 복잡한 쿼리의 재 컴파일을 방지 할 수 있습니다.

    이름의 최대 수는 고정되어있는 경우, 당신은 매개 변수가있는 쿼리를 사용해야합니다.

    위의 경우 중 어느 것도 적용되지 않습니다 그러나, 나는 당신의 접근 # 1과 쿼리의 이름을 인라인으로 갈 것입니다.

  7. from https://stackoverflow.com/questions/13027708/sql-multiple-columns-in-in-clause by cc-by-sa and MIT license