2017-10-24 1 views
0

테이블 A, 테이블 B 및 테이블 C를 함께 조인해야하는 세 개의 테이블이 있습니다.키당 여러 레코드를 반환하지 않고 키당 여러 레코드가있는 테이블에서이 조인을 수행하려면 어떻게합니까?

'userid'필드에서 tableA와 tableB가 서로 조인되고 'numeric_id'에서 tableC가 조인됩니다.

제 문제는 각 numeric_id에 대해 tableC에 여러 레코드가 있다는 것입니다. 질의를 numeric_id의 별개 목록으로 어떻게 제한 할 수 있습니까?

이 쿼리는 예상대로 23 개 행을 반환 : 각 numeric_id이 tableC

SELECT * FROM tableA, tableB,tableC 
WHERE PRODUCT_CODE = 'AS432' 
AND tableA.userid = tableB.userid 
AND tableB.numeric_id = tableC.numeric_id 

에 여러 레코드를 가지고 있기 때문에

SELECT * FROM tableA, tableB 
WHERE PRODUCT_CODE = 'AS432' 
AND tableA.userid = tableB.userid 

이 쿼리 내가이 다수를 반환하지 않고 가입 수행 할 수있는 방법 52 개 행을 반환 tableC의 numeric_id 당 레코드 수?

예 데이터 :

tableA: 
userid  first_name 
jsamsonite John 
sjohnson  Sam 
hpulaski  Harry 

TableB의 :

userid  last_name numeric_id 
jsamsonite Samsonite 56 
sjohnson Johnson 57 
hpulaski Pulaski 58 

tableC :

numeric_id transaction_number region_group 
56   56345   789 
56   89848   789 
57   89800   987 
57   52355   987 
57   49939   987 
58   49892   398 

가 이상적으로 쿼리가

tableA.userid tableA.first_name tableB.userid tableB.last_name tableB.numeric_ID tableC.numeric_id tableC.region_group 
jsamsonite John    jsamsonite Samsonite 56 56 789 
sjohnson  Sam    sjohnson  Johnson  57 57 987 
hpulaski  Harry    Hpulaski  Pulaski  58 58 398 
+1

C에서 어떤 값을 사용합니까? C가 중복 된 이유가 있습니다. 또는 C 복제본의 모든 값입니까? col1, col2 및 numeric_ID가 각 레코드에 대해 일관성이 있다고 가정하면 tableC 대신 (Select Distinct col1, col2, TableC에서 Numeric_ID를 선택하여) 조인 할 수 있습니다. 중복을 제거 할 수 있습니다. 아니면 C로만 numeric_ID를 가진 레코드를 원한다면 필터를 C로 사용하고 있습니까? 그렇다면 존재를 사용해야합니다. – xQbert

+0

몇 가지 샘플 데이터와 원하는 결과를 제공하십시오. –

+0

샘플 데이터 – KinsDotNet

답변

0
을 반환

C에서 열을 필요로하지 않고 데이터를 제한한다면 어쩌면 존재할 수 있습니까? 조인 대신에?

SELECT tableA.*, tableB.* 
FROM tableA, tableB 
WHERE PRODUCT_CODE = 'AS432' 
    AND tableA.userid = tableB.userid 
    AND EXISTS (SELECT * FROM tablec WHERE tableB.numeric_id = tableC.numeric_id) 

하거나 중복되는 열 필요를 선택하고 별개의

SELECT * 
FROM tableA, tableB, (SELECT DISTINCT col1, Col2, numeric_ID from tablec) tablec 
WHERE PRODUCT_CODE = 'AS432' 
    AND tableA.userid = tableB.userid 
    AND tableB.numeric_id = tableC.numeric_id) 

또는 현대가 조인 구문을 사용하여 ... ANSI-92 표준을 사용합니다. 그러나 c와 같은 열 값을 가진 부질의에 아직도 별명으로.

SELECT * 
FROM tableA 
INNER JOIN tableB 
    on tableA.userid = tableB.userid 
INNER JOIN (SELECT DISTINCT col1, Col2, numeric_ID from tablec) tablec 
    on tableB.numeric_id = tableC.numeric_id 
WHERE PRODUCT_CODE = 'AS432' 
+0

으로 업데이트되었습니다. 다시 검사 할 필요가 없다면 일부 샘플 데이터와 예상 결과가 업데이트되었습니다. – KinsDotNet

+0

두 번째 해결책은 제가 찾고있는 해결책이었습니다. – KinsDotNet

+0

동의합니다. 방금 귀하의 의견에 주목했습니다. 비록 세 번째 쿼리가 잘 작동해야합니다. ANSI-87 상점 또는 ANSI-92 상점에 따라 달라집니다. – xQbert

관련 문제