programing

SQL - 이중 행이 있는 경우에만 행 선택

nicescript 2022. 12. 29. 22:04
반응형

SQL - 이중 행이 있는 경우에만 행 선택

구문: MariaDB

테이블 구조:

id [INT], value [INT], flag [INT]; id + flag is a primary key (no duplicate id + flag pair)

샘플 데이터:

[id] | [value] | [flag]
111  | 16      | 0               # row 111, 18, 1 exists (3rd)
222  | 17      | 1               # row 222, 20, 0 exists (5th)
111  | 18      | 1               # row 111, 16, 0 exists (1st)
333  | 19      | 1               # no row 333, ??, 0 exists
222  | 20      | 0               # row 222, 17, 1 exists (2nd)
444  | 21      | 0               # no row 444, ??, 1 exists

선택해야 합니다.value대응하는 쌍flag=0그리고.flag=1두 행이 모두 테이블에 존재하는 경우에만 해당됩니다.마법에 걸린 후 예상되는 결과SELECT스테이트먼트:

[value_0] | [value_1]
16        | 18
20        | 17

내가 시도한 것:

SELECT id, value, flag FROM table as p WHERE COUNT(SELECT id from table where id = p.id) = 2

다른 건 생각할 수 없었어SQL 지식은 매우 기초적입니다.날 도울 수 없다면 최소한 내가 어떻게 할 수 있는지 보여 줘SELECT이와 같은 것

[value_0] | [value_1]
NULL      | 19
16        | 18
20        | 17
21        | NULL,

이게 더 쉬울 것 같아서요.이 선택 테이블에는 NULL 값이 정확히1개 포함되어 있는 행도 포함되어 있다는 점(원래 테이블에는 대응하는 플래그가 없습니다)을 제외하면 예상 출력과 동일합니다.

감사해요.

셀프 가입은 매우 간단합니다.

select t1.value value_0, t2.value value_1
from tablename t1 inner join tablename t2
on t1.id = t2.id and t1.flag = 0 and t2.flag = 1

데모를 참조해 주세요.
결과:

> value_0 | value_1
> ------: | ------:
>      20 |      17
>      16 |      18

집약 사용:

select id, min(value), max(value)
from t
group by id
having min(flag) = 0 and max(flag) = 1;

에 대해 2개 이상의 행이 있을 수 있는 경우id, 원하는 경우group_concat():

select id, group_concat(value)
from t
group by id
having min(flag) = 0 and max(flag) = 1;

값을 정렬하려면 조건부 집약을 사용합니다.

select id,
       max(case when flag = 0 then value end) as value_0,
       max(case when flag = 1 then value end) as value_1
from t
group by id
having min(flag) = 0 and max(flag) = 1;

@forpas 답변은 맞지만 null 값이 필요한 경우 다음과 같은 작업을 수행할 수 있습니다.

select * from
(select id,value,flag from tablename where flag = 0) as val0
LEFT JOIN (select id,value,flag from tablename where flag = 1) as val1 on val0.id = val1.id
UNION 
select * from
(select id,value,flag from tablename where flag = 0) as val0
 RIGHT JOIN (select id,value,flag from tablename where flag = 1) as val1 on val0.id = val1.id

데모를 보려면 여기를 클릭하십시오.

언급URL : https://stackoverflow.com/questions/64930390/sql-select-row-only-if-dual-row-exists

반응형