source

이 LEFT JOIN에서 반환되는 행 수를 하나로 제한하려면 어떻게 해야 합니까?

ittop 2023. 8. 5. 11:00
반응형

이 LEFT JOIN에서 반환되는 행 수를 하나로 제한하려면 어떻게 해야 합니까?

그래서 저는 이것에 대한 해결책을 보았다고 생각하지만 그것들은 모두 매우 복잡한 질문들입니다.참고로 오라클 11g에 있습니다.

제가 가진 것은 간단한 1대 다 가입으로 효과는 좋지만 많은 가입은 필요하지 않습니다.나는 단지 왼쪽 테이블(하나)이 가입 조건을 충족하는 임의의 행에 가입하기를 원합니다...행 수가 많지 않습니다.

쿼리가 롤업에 포함되어 있기 때문에 이 작업을 수행해야 합니다. 따라서 일반적인 왼쪽 조인을 수행하면 1개만 얻어야 하는 5개의 행이 생성됩니다.

예를 들어 데이터는 다음과 같습니다.

TABLE 1:
-------------
TICKET_ID      ASSIGNMENT
5              team1
6              team2

TABLE 2:
-------------
MANAGER_NAME   ASSIGNMENT_GROUP  USER
joe            team1             sally
joe            team1             stephen
joe            team1             louis
harry          team2             ted
harry          team2             thelma

제가 해야 할 일은 이 두 개의 테이블을 Assignment=ENTUREMENT_GROUP에 결합하는 것이지만 반환되는 행은 하나뿐입니다.

내가 왼쪽 조인을 할 때 나는 세 줄을 돌려받습니다. 그것이 hte 왼쪽 조인의 본질이기 때문입니다.

오라클이 행 번호(파티션 기준)를 지원하는 경우 행이 1과 같은 위치를 선택하여 하위 쿼리를 생성할 수 있습니다.

SELECT * FROM table1
LEFT JOIN
(SELECT *
FROM   (SELECT *,
           ROW_NUMBER()
             OVER(PARTITION BY assignmentgroup ORDER BY assignmentgroup) AS Seq
    FROM  table2) a
WHERE  Seq = 1) v
ON assignmet = v.assignmentgroup

당신은 이런 것을 할 수 있습니다.

SELECT t1.ticket_id, 
       t1.assignment,
       t2.manager_name,
       t2.user
  FROM table1 t1
       LEFT OUTER JOIN (SELECT manager_name,
                               assignment_group,
                               user,
                               row_number() over (partition by assignment_group
                                                    --order by <<something>>
                                                 ) rnk
                          FROM table2) t2
                     ON (    t1.assignment = t2.assignment_group
                         AND t2.rnk = 1 )

이렇게 하면 데이터가 분할됩니다.table2타고assignment_group그런 다음 임의의 순위를 매겨 한 번에 하나의 임의 행을 당깁니다.assignment_group반환되는 행이 어떤 것인지(또는 반환되는 행을 결정론적으로 만들 수 있습니다.ORDER BY분석 함수에 대한 절.

제 생각에 당신이 필요한 것은GROUP BY에서ASSIGNMENT_GROUP들판.

http://www.w3schools.com/sql/sql_groupby.asp

MySQL에서는 할당에 따라 그룹화하고 완료할 수 있습니다.Oracle은 보다 엄격하며 (정의되지 않은 방식으로) 세 행의 값을 선택하기를 거부합니다.즉, 반환된 모든 열은 GROUP BY의 일부이거나 집계 함수(COUNT, MIN, MAX...)의 적용을 받아야 합니다.

물론 상관하지 않고 반환된 열에 일부 집계 함수를 사용하도록 선택할 수 있습니다.

select TICKET_ID, ASSIGNMENT, MAX(MANAGER_NAME), MAX(USER)
from T1
left join T2 on T1.ASSIGNMENT=T2.ASSIGNMENT_GROUP
group by TICKET_ID, ASSIGNMENT

만약 당신이 그렇게 한다면, 나는 당신이 애초에 JOIN이 필요한지 심각하게 의심할 것입니다.

MySQL은 열에 대한 그룹 값의 문자열 연결을 원하는 경우 GROUP_CONCAT에도 도움이 될 수 있지만(흔히 인간과 같은 경우) Oracle은 엄청나게 복잡합니다.

이미 제안한 대로 하위 쿼리를 사용하는 것이 옵션입니다. 예를 보려면 여기를 보십시오.또한 맨 위 행을 선택하기 전에 하위 쿼리를 정렬할 수 있습니다.

Oracle에서 1개의 결과를 원하는 경우 문을 사용하여 쿼리의 첫 번째 N개 값을 가져올 수 있습니다. 예를 들어 다음과 같습니다.

SELECT *
FROM TABLEX
WHERE
ROWNUM = 1 --gets the first value of the result

이 단일 쿼리의 문제는 Oracle이 데이터를 같은 순서로 반환하지 않는다는 것입니다.따라서 rownum을 사용하기 전에 데이터를 정렬해야 합니다.

SELECT *
FROM
    (SELECT * FROM TABLEX ORDER BY COL1)
WHERE
ROWNUM = 1

당신의 경우, 하나의 결과만 필요한 것처럼 보이기 때문에, 당신의 질의는 다음과 같아야 합니다.

SELECT *
FROM
    TABLE1 T1
    LEFT JOIN 
    (SELECT *
    FROM TABLE2 T2 WHERE T1.ASSIGNMENT = T2.ASSIGNMENT_GROUP
    AND
    ROWNUM = 1) T3 ON T1.ASSIGNMENT = T3.ASSIGNMENT_GROUP

하위 쿼리를 사용할 수 있습니다. 상위 1개를 선택

언급URL : https://stackoverflow.com/questions/10236229/how-do-i-limit-the-number-of-rows-returned-by-this-left-join-to-one

반응형