[SQL] SQL "IN"절에 튜플을 사용하여
SQLSQL "IN"절에 튜플을 사용하여
나는 필드를 포함하는 테이블이 GROUP_ID 및 group_type하고 난 튜플의 목록에서 어떤 튜플 (그룹 ID, 그룹 유형)를 가진 모든 레코드의 테이블을 조회 할. 예를 들어, 내가 좋아하는 뭔가를 할 수 있도록하려면 :
SELECT *
FROM mytable
WHERE (group_id, group_type) IN (("1234-567", 2), ("4321-765", 3), ("1111-222", 5))
절에 SQL에 튜플을 사용하지만,이 솔루션은 튜플 목록이 다른 테이블에서 페치 될 것입니다 거기에 가정 제안 : 매우 비슷한 질문은 이미에 요청합니다. 내 경우에는 작동하지 않습니다이 튜플 값이 하드 코딩되어있다.
한 가지 해결책은 사용 문자열 연결하는 것입니다 :
SELECT *
FROM mytable
WHERE group_id + STR(group_type, 1) IN ("1234-5672", "4321-7653", "1111-2225")
그러나 문제는 테이블이 매우 크고 매우 비싼 것이 각 레코드에 대한 문자열 연결 및 전환을하는 것입니다.
어떠한 제안?
해결법
-
==============================
1.왜 OR 문을 구성하지?
왜 OR 문을 구성하지?
SELECT * FROM mytable WHERE (group_id = '1234-567' and group_type = 2) OR (group_id = '4321-765' and group_type = 3) OR (group_id = '1111-222' and group_type = 5)
부여, 그것은 좋은 개념에 예로서 깔끔한로 보지 않고는 일을 할 것입니다 (그리고 경우 튜플이 존재했다과 함께, 그것은 가장 가능성이 내부적으로 정확히 같은 방식으로 그것을 구현하는 것입니다.
-
==============================
2.아주 작은 비틀기를 (단일 이중 따옴표를 교체하고 VALUES 키워드를 추가)을 감안할 때, 귀하가 제안하는 구문은 유효한 표준 SQL-92 구문이 즉
아주 작은 비틀기를 (단일 이중 따옴표를 교체하고 VALUES 키워드를 추가)을 감안할 때, 귀하가 제안하는 구문은 유효한 표준 SQL-92 구문이 즉
SELECT * FROM mytable WHERE (group_id, group_type) IN ( VALUES ('1234-567', 2), ('4321-765', 3), ('1111-222', 5) );
슬프게도, MSFT는 SQL 서버에 추가하고 그것에게 '예상치 못한'기능을 고려하지 않았습니다.
FWIW PostgreSQL을하고 SQLite는이 구문을 지원하는 SQL 제품의 예입니다.
-
==============================
3.SQL Server 2008에서는 다음과 같이 할 수 있습니다
SQL Server 2008에서는 다음과 같이 할 수 있습니다
select * from mytable as T where exists (select * from (values ('1234-567', 2), ('4321-765', 3), ('1111-222', 5)) as V(group_id, group_type) where T.group_id = V.group_id and T.group_type = V.group_type )
-
==============================
4.이러한 튜플이 다른 테이블에있는 척하기 위해 공통 테이블 표현식을 사용할 수 있습니다 :
이러한 튜플이 다른 테이블에있는 척하기 위해 공통 테이블 표현식을 사용할 수 있습니다 :
;WITH Tuples as ( select '1234-567' as group_id, 2 as group_type union all select '4321-765', 3 union all select '1111-222', 5 ) SELECT * /* TODO - Pick appropriate columns */ from mytable m where exists ( select * from Tuples t where m.group_id = t.group_id and m.group_type = t.group_type)
-
==============================
5.이 솔루션을 사용하여이 작업을해야합니다 :
이 솔루션을 사용하여이 작업을해야합니다 :
SELECT * FROM mytable m WHERE EXISTS ( SELECT * FROM ( SELECT "1234-567" group_id, 2 group_type UNION ALL SELECT "4321-765", 3 UNION ALL SELECT "1111-222", 5) [t] WHERE m.group_id = t.group_id AND m.group_type = t.group_type)
BTW, 당신은 아마 그 내부 테이블을 생성하기 위해 CTE를 사용해야합니다.
-
==============================
6.여기에 조인을 사용하여 다른 튜플 솔루션입니다 :
여기에 조인을 사용하여 다른 튜플 솔루션입니다 :
SELECT * FROM mytable m JOIN ( SELECT "1234-567" group_id, 2 group_type UNION ALL SELECT "4321-765", 3 UNION ALL SELECT "1111-222", 5 ) [t] ON m.group_id = t.group_id AND m.group_type = t.group_type
-
==============================
7.나는 비슷한 문제가 있었다하지만 내 튜플 수집 동적했다 - 그것은 쿼리 매개 변수의 SQL 서버로 보내졌다. 나는 다음과 같은 해결책을했다 :
나는 비슷한 문제가 있었다하지만 내 튜플 수집 동적했다 - 그것은 쿼리 매개 변수의 SQL 서버로 보내졌다. 나는 다음과 같은 해결책을했다 :
그것은 조금 더 복잡한 질문에 설명 된 것보다 내 상황에서 잘 작동 보인다.
이 t을 사용할 필요가 있음을 유의하십시오. * 대신 *와 노드 방법의 요구에서 반환 된 테이블의 (이 경우에는 그것의 튜플 (골)) 별칭을 지정할 수 있습니다.
-
==============================
8.
select * from table_name where 1=1 and (column_a, column_b) in ((28,1),(25,1))
from https://stackoverflow.com/questions/8006901/using-tuples-in-sql-in-clause by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 어떻게 MySQL의에서 키워드 검색을 구현하는 방법? (0) | 2020.05.08 |
---|---|
[SQL] 측정 쿼리 성능 : VS "실행 계획 쿼리 비용" "시간은 촬영" (0) | 2020.05.08 |
[SQL] MySQL은 - 열에서 문자를 교체 (0) | 2020.05.08 |
[SQL] 어떻게 PostgreSQL의 쿼리에서 행 번호를 표시합니다? (0) | 2020.05.08 |
[SQL] Laravel 고급 알의 방법 함수에 변수를 전달하는 방법? (0) | 2020.05.08 |