programing

MySQL 선택 / NULL 손실 시 그룹화

procenter 2022. 10. 20. 21:44
반응형

MySQL 선택 / NULL 손실 시 그룹화

다음 두 개의 테이블이 있습니다.

> select * from t1;
+-------+-------+
| text1 | text2 |
+-------+-------+
| a     | NULL  |
| b     | c     |
| d     | e     |
+-------+-------+

> select * from t2;
+-------+-------+-------+
| text1 | text2 | value |
+-------+-------+-------+
| a     | NULL  |     1 |
| a     | NULL  |     2 |
| a     | NULL  |     3 |
| b     | c     |     1 |
| b     | c     |     2 |
| d     | e     |     3 |
| f     | g     |     1 |
+-------+-------+-------+

제가 하려는 것은 두 테이블을 함께 접합하는 것입니다.value각각에 대해서text1,text2에 포함되는 조합t1.

다음은 지금까지의 질문이며, 그 결과는 다음과 같습니다.

> select text1, text2, min(value)
> from t1
> natural join t2
> group by text1, text2
> order by text1 asc;
+-------+-------+------------+
| text1 | text2 | min(value) |
+-------+-------+------------+
| b     | c     |          1 |
| d     | e     |          3 |
+-------+-------+------------+

그래서 내가 필요한 건 거의 맞지만, 보다시피, 난 점점 더 많은 걸 잃어가고 있어.a그 이유는text2NULL예상되는 결과는 다음과 같습니다.

+-------+-------+------------+
| text1 | text2 | min(value) |
+-------+-------+------------+
| a     | NULL  |          1 |
| b     | c     |          1 |
| d     | e     |          3 |
+-------+-------+------------+

그럼 내 질문의 어떤 점이 문제일까?NULL가치관?

주의:t2다른 조합이 있을 수 있다text1그리고.text2,예.('a','z')내 결과에 원하지 않는, 그래서 내가 둘 다 가진 이유text1그리고.text2내 안에서GROUP BY절을 클릭합니다.적어도, 나는 그것을 목표로 하고 있다(분명히 내가 원하는 대로 작동하지 않는 것이 분명하다).

참고로 MariaDB 버전 10.3.8을 사용하고 있습니다.

와의 결합을 시도합니다.<=>null safe 연산자.

SELECT t1.text1,
       t1.text2,
       min(t2.value)
       FROM t1
            INNER JOIN t2
                       ON t2.text1 <=> t1.text1
                          AND t2.text2 <=> t1.text2
       GROUP BY t1.text1,
                t1.text2
       ORDER BY t1.text1 ASC;

현재 가지고 계신 내용은 다음과 같습니다.

SELECT t1.text1,
       t1.text2,
       min(t2.value)
       FROM t1
            INNER JOIN t2
                       ON t2.text1 = t1.text1
                          AND t2.text2 = t1.text2
       GROUP BY t1.text1,
                t1.text2
       ORDER BY t1.text1 ASC;

그리고...NULL = NULLnull이 있는 행이 일치하지 않으므로 결과가 되지 않습니다.

를 사용할 수 없습니다.NATURAL JOIN또는USING()여기서 NULL-safe 연산자를 사용합니다.<=>대신 'ON' 절에 추가되어 있습니다.NULL <=> NULL로.1,하는 동안에NULL = NULLNULL:

select t1.text1, t1.text2, min(value)
from t1
join t2
  on  t2.text1 = t1.text1
  and t2.text2 <=> t1.text2
group by t1.text1, t1.text2
order by t1.text1 asc;

데모: http://sqlfiddle.com/ #!9/3ca2a1/1

생각합니다natural join문제가 있다

내추럴 조인(Natural Join)은 INSER JOIN의 변형으로 조인 조건이 양쪽 테이블의 공통 컬럼에 암묵적으로 포함되어 있습니다.당신의 경우 Natural Join의 쿼리는 다음과 같이 쓸 수 있으며, A와 B의 조회를 시도하기 때문에 어떠한 결과도 반환되지 않습니다.

select *
from table1
natural join table2

이하와 같이 Inner Join에서도 동일하게 기재할 수 있습니다.

select t1.*
from table1 t1
inner join table2 t2
on t1.text1 = t2.text1 and t1.text2 = t2.text2

언급URL : https://stackoverflow.com/questions/51658106/mysql-select-group-by-losing-nulls

반응형