2014-12-11 4 views
0

I 다음 스키마 있습니다쿼리 세 이상의 테이블

|partner| 
--------- 
id 

|contract| 
---------- 
id  
partner_id 
termination_date 

|comtract_items| 
--------------- 
id 
contract_id 
product_id 

내가 아니 계약을 체결 한 유효한 계약 (termination_date is NULL)와 이있는 모든 파트너를 선택합니다을 product_id의 392 및 393

여기

지금까지 내 쿼리입니다 :

SELECT 
    c.id, 
    c.subject 
FROM 
    contract_contract c 

WHERE 
    c.termination_date is NULL or c.termination_date > '2014-12-11' 
    and c.id NOT IN (SELECT contract_id 
        FROM contract_item 
        WHERE product_id IN (392, 393)) 

모든 아이디어를 어떻게 쿼리를 작성하기 위해?

+0

귀하의 질의가 적절해 보입니다. 문제가 무엇입니까? –

+0

쿼리에 contract_contract.subject가 있지만 테이블 레이아웃에는 없습니다. 명확히하십시오. 또한, 'product_id 392와 393과의 계약 없음'이라는 제한은 그것이 적용되는 계약의 상대방을 배제하기로되어있다. –

+0

그것의 뒤에 오는 관계> 1 명의 협동자는 많은 계약이있을 수 있고 1 개의 계약은 많은 선을 가질 수있다. 내 쿼리와 나는 어떤 계약에서 이러한 제품 중 하나를 havnt 모든 파트너를 얻을 싶어요 – ghovat

답변

1

그것은 지금 "and with no contracts with the product_id's 392 and 393"그 블랙리스트 product_id의의 어떤 계약이 파트너 배제하도록되어 명확한 것이 있다는 달성해야합니다에서

SELECT * -- unclear which columns you want 
FROM partner p 
WHERE EXISTS (
    SELECT 1 
    FROM contract_contract c 
    WHERE (c.termination_date IS NULL OR c.termination_date > '2014-12-11') 
    AND c.partner_id = p.id 
    ) 
AND NOT EXISTS (
    SELECT 1 
    FROM contract_contract c 
    JOIN contract_item ci ON ci.contract_id = c.id 
    WHERE c.partner_id = p.id 
    AND ci.product_id IN (392, 393) 
    ); 

당신의 원래 검색어 괄호 전에 AND 전에 바인딩 할 수 있도록 만들 수 있습니다. 표준 AND이 먼저 바인딩됩니다. 아마도 당신이 원하는 것은 아닐 것입니다.

그러나 추가 된 술어가 별도의 EXISTS 표현식으로 이동되었으므로 업데이트 된 쿼리에서 필요성은 사라졌습니다.

+0

다음과 같은 관계> 한 파트너가 많은 계약을 가질 수 있고 한 계약은 많은 라인을 가질 수 있습니다. 내 쿼리와 나는 어떤 계약에서 이러한 제품 중 하나를 havnt 모든 파트너를 얻을 싶어요 – ghovat

+0

@ GeeSchler : 적절하게 쿼리를 적응. –

+0

끝내 주셔서 감사합니다. – ghovat

1

는 좀 괄호를 사용하면 매우 가까웠다 생각하지만 잊었 :

여기
WHERE (c.termination_date is NULL or c.termination_date > '2014-12-11') and ... 

내가이 ::

SELECT DISTINCT c.partner_id 
FROM Contract c 
WHERE (c.TerminationDate IS NOT NULL OR c.TerminationDate > CURRENT_DATE) 
AND NOT EXISTS (SELECT 1 FROM ContractItem 
       WHERE contract_id = c.id 
       AND product_id IN (392, 393)) 
+0

다음과 같은 관계> 한 파트너가 많은 계약을 가질 수 있고 한 계약은 많은 라인을 가질 수 있습니다. 내 쿼리와 나는 어떤 계약에서 이러한 제품 중 하나를 havnt 모든 파트너를 얻을 싶어요 – ghovat

1

내가 유효한있는 모든 파트너를 선택하고자 할 것입니다 방법 계약 (termination_date는 NULL)이며 제품 ID 392 및 393과 계약되지 않습니다.

이 SQL 문은

SELECT c.partner_id 
FROM contract c 
INNER JOIN contract_items ci on ci.contract_id = c.id 
WHERE (c.termination_date is NULL 
    or c.termination_date > '2014-12-11') 
AND ci.productID NOT IN (392, 393);