programing

맨 왼쪽 테이블의 모든 행에 대해 맨 오른쪽 테이블에서 하나의 행만 반환

bestprogram 2023. 10. 24. 21:28

맨 왼쪽 테이블의 모든 행에 대해 맨 오른쪽 테이블에서 하나의 행만 반환

테이블이 두 개 있습니다.가장 왼쪽 테이블의 각 레코드마다 오른쪽 테이블의 레코드가 하나씩만 반환되는 방식으로 그들과 함께 하고 싶습니다.아래에 예시를 넣었습니다.실제 데이터가 약 4M 행이므로 서브쿼리와 임시 테이블은 피하고 싶습니다.또한 가장 오른쪽 테이블의 레코드가 일치하는 경우에는 상관이 없습니다.감사합니다!

테이블 사용자:

-------------
| id | name |
-------------
| 1  | mike |
| 2  | john |
| 3  | bill |
-------------

테이블 트랜잭션:

---------------
| uid | spent | 
---------------
| 1   | 5.00  |
| 1   | 5.00  |
| 2   | 5.00  |
| 3   | 5.00  |
| 3   | 10.00 |
---------------

예상 출력:

---------------------
| id | name | spent |
---------------------
| 1  | mike | 5.00  |
| 2  | john | 5.00  |
| 3  | bill | 5.00  |
---------------------

용도:

  SELECT u.id,
         u.name,
         MIN(t.spent) AS spent
    FROM USERS u
    JOIN TRANSACTIONS t ON t.uid = u.id
GROUP BY u.id, u.name

이것은 적어도 하나의 트랜잭션 기록을 가지고 있는 사용자만 반환합니다.지원 기록이 없는 사용자뿐만 아니라 지원 기록이 없는 사용자를 보려면 다음을 사용합니다.

   SELECT u.id,
          u.name,
          COALESCE(MIN(t.spent), 0) AS spent
     FROM USERS u
LEFT JOIN TRANSACTIONS t ON t.uid = u.id
 GROUP BY u.id, u.name

반환되는 특정 행에 관심이 없는 경우.

select id, name, spent
from users
left join transactions on users.id = transactions.uid
group by id

이렇게 하면 사용자당 하나의 행이 반환됩니다.그것은 첫번째 일치된 거래가 될 것입니다.

이것이 실제로 당신의 질문에 대답하지 않는다면 죄송합니다.어떤 사용자가 적어도 하나 이상의 트랜잭션을 가지고 있는지 확인하려는 것 같습니다.이 과정에서 각 사용자가 다음과 같은 작업을 수행하여 지출한 금액을 확인할 수 있습니다.

선택한다.u.id ,u.name ,합계(t.spent)부터사용자 u내부 결합 트랜잭션 tOn t.uid = u.id그룹화 기준u.id, u.name

언급URL : https://stackoverflow.com/questions/3313614/return-only-one-row-from-the-right-most-table-for-every-row-in-the-left-most-tab