필터가있는 Oracle ANSI 완전 외부 조인에서 결과를 반환하지 않는 문제가 발생했습니다. 나는 모든 머펫 모든 유효한 전화 번호를 선택하려면이 테이블에서필터 (ANSI)가 예상대로 작동하지 않는 Oracle 전체 외부 조인
Table 1 - MUPPET
ID NAME
1 Kermit the Frog
2 Fozzie Bear
3 Mrs. Piggy
4 Beaker
5 Animal
6 Swedish Chef
Table 2 - PHONE
ID MUPPET_ID PHONE VALID
1 1 1111111111 Y
2 1 2222222222 N
3 2 3333333333 Y
4 4 4444444444 Y
5 5 5555555555 Y
6 6 6666666666 Y
7 6 7777777777 N
8 8 8888888888 Y
... 내가 일을하고보고하고 무엇을 설명하기 위해 간단한 예를 만들었습니다. 나는 모든 muppets에게 전화 번호가 있는지 여부를 알려주고 그들이 muppet과 관련이 있는지 여부와 관계없이 모든 유효한 전화 번호를 선택하려고합니다. 이것은 내가 일을 기대 쿼리 ...
SELECT m.id muppet_id,
m.name,
p.id phone_id,
p.phone,
p.valid
FROM muppet m
FULL OUTER JOIN
phone p
ON (M.ID = P.MUPPET_ID AND P.VALID = 'Y')
그러나 여기에 내가 바깥에는 비 유효한 전화를 지정하지 않은 경우에도 비 유효 폰을 포함하는 결과이다 필터를
MUPPET_ID NAME PHONE_ID PHONE VALID
1 Kermit the Frog 1 1111111111 Y
2 2222222222 N
2 Fozzie Bear 3 3333333333 Y
4 Beaker 4 4444444444 Y
5 Animal 5 5555555555 Y
6 Swedish Chef 6 6666666666 Y
7 7777777777 N
8 8888888888 Y
3 Mrs. Piggy
을 조인 나는 ...
0,123,516 마침내 나는 완전 외부의 왼쪽 부분에 하위 선택을 사용하여 찾고 있던 결과SELECT m.id muppet_id,
m.name,
p.id phone_id,
p.phone,
p.valid
FROM muppet m
FULL OUTER JOIN
(SELECT id,
phone,
valid,
muppet_id
FROM phone
WHERE valid = 'Y') p
ON (M.ID = P.MUPPET_ID)
... 그 결과에 가입 얻을 수 있었다
MUPPET_ID NAME PHONE_ID PHONE VALID
1 Kermit the Frog 1 1111111111 Y
2 Fozzie Bear 3 3333333333 Y
4 Beaker 4 4444444444 Y
5 Animal 5 5555555555 Y
6 Swedish Chef 6 6666666666 Y
8 8888888888 Y
3 Mrs. Piggy
하지만 왜 이런 식으로 쿼리해야하는지 이해할 수 없습니다. 누군가 내 초기 외부 조인 필터가 예상대로 작동하지 않는 이유에 대해 설명해주십시오.
편집 :
가 더욱 흥미 롭군요. 나는이 쿼리를 실행하면
select valid from (
SELECT m.id muppet_id,
m.name,
p.id phone_id,
p.phone,
p.valid
FROM muppet m
FULL OUTER JOIN
phone p
ON (M.ID = P.MUPPET_ID AND P.VALID = 'Y')
) where valid = 'Y'
을 예상대로 나는 6 개 기록을 얻을하지만이 프로그램을 실행할 때 나는 레코드가
select valid from (
SELECT m.id muppet_id,
m.name,
p.id phone_id,
p.phone,
p.valid
FROM muppet m
FULL OUTER JOIN
phone p
ON (M.ID = P.MUPPET_ID AND P.VALID = 'Y')
) where valid <> 'Y'
어쩌면이 오라클의 최적화 나 드라이버의 문제입니다 반환받을 ??
전체 외부 조인을 사용하면 db에 모든 레코드를 조인하고 조인 조건을 충족시키지 않는 모든 레코드를 유지할 것을 요청합니다. 당신의 예제에서'valid = 'Y'는 다른 두 레코드가 연결되지 않도록 조건의 일부입니다. 이것이 예상 된 결과입니다. – haki
맞습니다.'valid = 'Y '' 조건은'on' 절 대신'where' 절에 지정해야합니다. – GriffeyDog
GriffeyDog -'valid = 'Y ''의 where 절은 Piggy 여사의 마지막 기록을 반환하지 않으므로 어느 쪽도 작동하지 않습니다 – Cymon