이 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
'source' 카테고리의 다른 글
PowerShell에서 큰(큰) 파일의 줄 수 가져오기 (0) | 2023.08.05 |
---|---|
Laravel 5.0 설치 방법 (0) | 2023.08.05 |
라벨 모델이 저장되었는지 쿼리가 실행되었는지 확인합니다. (0) | 2023.08.05 |
ASP를 사용하여 JS 파일에서 jQuery에 대한 ajax URL 설정.NET MVC (0) | 2023.08.05 |
기본 이미지가 업데이트된 경우 도커 컨테이너를 자동으로 업데이트하는 방법 (0) | 2023.08.05 |