2016-06-15 4 views
1

가입 각 고객 또는 고객을 위해 내가 같은 Customer_ID.Customer_ID 여러 번이 Invoice.Customer_ID1에서 더 CUSTOMER_ID내가 2 개 테이블을 SQL 문 최적화

이 없습니다.

나는 Customer Table Join Invoice Table의 모든 기록을 얻을 좋아 - CUSTOMER_ID이 행 중 하나에서 발견 된 검색을 중지하는 경우 Customer_ID = Customer_ID2 Or Customer_ID = Customer_ID2

에서 확인하지 경우 Customer_ID = Customer_ID1 있는지 확인하세요.

+0

예를 – Mahmoud

+0

을 제공하십시오 당신은 필요 COALESCE() (와 고객 테이블을 세 번 가입) – wildplasser

+0

SQL 당신은 당신이 원하는 어떤 결과 시스템에게 의미하는 _declarative_ 언어이며 데이터를 얻을 수있는 가장 좋은 방법을 결정 .그래서 "customer_ID가 행 중 하나에서 발견되면 검색이 중지됩니다"라는 말은 _how_가 데이터를 가져올 것이므로 SQL에 적합하지 않습니다. 따라서 쿼리를 작성하는 방법이 아닌 원하는 것에 중점을 둔 쿼리를 작성해야합니다. –

답변

0
select 
    * 
from [Table Invoice] A 
JOIN [Customer] B 
    ON B.Customer_ID = A.Customer_ID1 OR (B.Customer_ID <> A.Customer_ID1 AND B.Customer_ID = A.Customer_ID2) OR (B.Customer_ID = A.Customer_ID3 AND B.Customer_ID <> A.Customer_ID2 AND B.Customer_ID <> A.Customer_ID1) 

이렇게하면 모든 고객의 모든 인보이스가 반환됩니다. 한 고객에 대해서만 인보이스가 필요한 경우 -

WHERE B.Customer_ID = @YourCustomerID 

진술을 추가하십시오. 당신은 오직 하나, 첫 번째 송장이 필요하면, 'TOP 1'을 추가 문 선택 :

SELECT TOP 1 
0

는 내부가에 가입 할 수 또는 절을 아마

select Customer.*, Invocie.* 
from Customer 
inner join Invoice on (Customer.Customer_ID = Invoce.Customer_ID1 
    OR Customer.Customer_ID = Invoce.Customer_ID2 
    OR Customer.Customer_ID = Invoce.Customer_ID3) 
1

쿼리를 작성하는 가장 좋은 방법은 다음과 같습니다

select . . . 
from customer c join 
    invoice i 
    on c.customer_id = coalesce(i.customer_id1, i.customer_id2, i.customer_id3); 

customer(customer_id)의 색인을 이용할 수 있어야합니다. 이 효율적이 아닌 경우, 다른 대안은 left join입니다 :

select . . ., coalesce(c1.col1, c2.col1, c3.col1) as col1, . . . 
from invoice i left join 
    customer c1 
    on c1.customer_id = i.customer_id1 left join 
    customer c2 
    on c2.customer_id = i.customer_id2 left join 
    customer c3 
    on c3.customer_id = i.customer_id3; 

left joincustomer(customer_id)에 인덱스를 활용할 수 있습니다. select에서 coalesce()을 사용하여 오른쪽 표에서 필드를 선택해야합니다.

0

이것은 귀하의 요청을 이해하는 방법입니다. 송장 표에 적어도 하나의 항목이있는 모든 고객을 원합니다. 그러나 고객별로 "최고"송장 기록만을 원합니다. ID1이 ID2와 일치하고 ID2가 ID3보다 잘 일치합니다.

테이블을 결합하여 모두를과 일치시키고 가장 일치하는 레코드 # 1을 부여하는 row_number으로 성냥의 순위를 매기십시오. 그런 다음 행 1 위를 유지하십시오.

select * 
from 
(
    select 
    c.*, 
    i.*, 
    row_number() over 
    (
     partition by c.customer_id order by 
     case c.customer_id 
      when i.customer_id1 then 1 
      when i.customer_id2 then 2 
      when i.customer_id3 then 3 
     end 
    ) as rn 
    from customer c 
    join invoice i on c.customer_id in (i.customer_id1, i.customer_id2, i.customer_id3) 
) 
where rn = 1; 
관련 문제