programing

단일 행에 대한 일대다 SQL SELECT

goodsources 2023. 9. 3. 16:14
반응형

단일 행에 대한 일대다 SQL SELECT

두 개의 테이블에 데이터가 있습니다.

첫 번째 테이블에는 PKID라는 기본 키가 있습니다.

PKID  DATA
0    myData0
1    myData1
2    myData2

두 번째 테이블에는 테이블 1의 PKID 열이 외부 키로 있습니다.

PKID_FROM_TABLE_1  U_DATA
       0          unique0
       0          unique1        
       0          unique2
       1          unique3
       1          unique4
       1          unique5
       2          unique6
       2          unique7
       2          unique8

제가 지금 하고 있는 기본적인 SELECT 진술은

SELECT a.PKID, a.DATA, b.U_DATA
FROM table1 as a
INNER JOIN table2 as b
ON a.PKID = b.PKID_FROM_TABLE_1

이렇게 하면 다음과 같은 표가 생성됩니다.

PKID   DATA     U_DATA
 0   myData0    unique0
 0   myData0    unique1
 0   myData0    unique2
 1   myData1    unique3
 1   myData1    unique4
 1   myData1    unique5
 2   myData2    unique6
 2   myData2    unique7
 2   myData2    unique8

제가 원하는 것은 다음 표입니다.

PKID   DATA    U_DATA1    U_DATA2    U_DATA3
 0     myData0 unique0    unidque1   unique2
 1     myData1 unique3    unidque4   unique5
 2     myData2 unique6    unidque7   unique8

도움이 될 경우 각 PKID는 표 2에 정확히 3개의 항목을 가집니다.

MySQL에서 이와 같은 것이 가능합니까?

이것이 결과를 얻을 수 있는 한 가지 방법입니다.

이 접근 방식은 상관된 하위 쿼리를 사용합니다.각 하위 쿼리는 다음을 사용합니다.ORDER BY테이블2에서 관련 행을 정렬하는 절이며, 사용합니다.LIMIT첫 번째, 두 번째 및 세 번째 행을 검색하는 절입니다.

SELECT a.PKID
     , a.DATA
     , (SELECT b1.U_DATA FROM table2 b1
         WHERE b1.PKID_FROM_TABLE_1 = a.PKID 
         ORDER BY b1.U_DATA LIMIT 0,1
       ) AS U_DATA1
     , (SELECT b2.U_DATA FROM table2 b2
         WHERE b2.PKID_FROM_TABLE_1 = a.PKID 
         ORDER BY b2.U_DATA LIMIT 1,1
       ) AS U_DATA2
     , (SELECT b3.U_DATA FROM table2 b3
         WHERE b3.PKID_FROM_TABLE_1 = a.PKID 
         ORDER BY b3.U_DATA LIMIT 2,1
       ) AS U_DATA3
  FROM table1 a
 ORDER BY a.PKID  

따르다

@gliese581g는 외부 쿼리에서 반환된 각 행에 대해 SELECT 목록의 각 하위 쿼리가 실행되기 때문에 이 접근 방식에 성능 문제가 있을 수 있다고 지적합니다.

이러한 접근 방식에는 다음과 같은 지표가 필요합니다.

ON table2 (PKID_FROM_TABLE_1, U_DATA)

-아니면, 최소한-

ON table2 (PKID_FROM_TABLE_1)

외부 키가 정의된 경우 후자의 인덱스가 이미 존재할 수 있습니다.이전 인덱스를 사용하면 정렬 작업("파일 정렬 사용") 없이 인덱스 페이지("인덱스 사용")에서 쿼리를 완전히 충족할 수 있습니다.

@glies581g는 이 접근 방식의 성능이 "대규모" 세트에서 문제가 될 수 있다는 점을 지적하는 것이 매우 옳습니다.

MySQL의 릴리스에 따라 GROUP_CONCAT를 조사할 수 있습니다.

언급URL : https://stackoverflow.com/questions/11441305/one-to-many-sql-select-into-single-row

반응형