2011-12-20 4 views
1

두 개의 테이블 알림 및 승인이 있습니다. 수신 확인에는 Notification Table의 기본 키를 보유하는 필드가 있습니다. 기본적으로 통지에는 많은 승인이 있습니다.조건이있는 경우 두 테이블에서 선택하는 SQL 쿼리

  1. 더 감사의 글이없는 Acknowledment.parent_id = Notification.id (특정 알림에 대한 기본적없이 승인) // 또는
  2. :

    Tables: Notification  Acknowledgment 
    
    fields: id, notifier  id, parent_id, status 
    

    는 이제 통지하도록에서 행을 선택해야

  3. 알림 확인 메시지가있는 경우 parent_id = Notification.id의 확인 메시지 중 하나가 Acknowledgment.status = someValue 인 경우 알림을 선택합니다.

의사 SQL 코드 :

"SELECT * FROM Notification (WHERE id is not present in Acknowledgment.parent_id) OR 
    (WHERE id is present in Acknowledgment.parent_id AND [email protected]" 

나는 간단한 쿼리로 휴식과이를 달성,하지만이 끝내야 하나 개의 쿼리를 알고 싶을 수 있습니다 ..

답변

1
SELECT * 
    FROM Notification n 
      LEFT OUTER JOIN Acknowledgment a ON a.parent_id = n.id 
    WHERE  (a.parent_id IS NULL OR a.status = @somevalue) 
1
SELECT n.* FROM Notification n 
LEFT OUTER JOIN Acknowledgment a ON a.parent_id=n.id 
WHERE a.status IS NULL OR [email protected] 
+0

@Akhil의 대답에는 코드의 a.status 대신 a.id IS NULL이 있습니다. 어쨌든 그런 행이 없기 때문에 어느쪽으로 가든지 괜찮습니까? – nawfal

+0

@nawfal 당신이 맞습니다 - 전혀 차이가 없습니다. – dasblinkenlight

+0

그것을 지적 해 주셔서 감사합니다. 나는 나의 대답을 업데이트했다. – Akhil

1

LEFT OUTER JOINS 대신 the EXISTS clause을 사용할 수 있습니다. 귀하의 예를 들어

:

SELECT * 
FROM Notification n 
WHERE NOT EXISTS (
    SELECT * 
    FROM Acknowledgement 
    WHERE parent_id = n.id 
) OR EXISTS (
    SELECT * 
    FROM Acknowledgement 
    WHERE parent_id = n.id AND status = @someValue 
) 

JOIN의는 경향이 더 나은 (내 예와 같이, 같은 테이블에 하나 이상을 사용하고 특히,) SQL 최적화 할, 난 그냥이 대안을 언급 이는 의사 쿼리의보다 직접적인 번역이기 때문입니다.

+0

감사합니다. 이것은 매우 간단하지만 좀 더 자세한 정보입니다.이 핵심 단어를 알려 주셔서 고마워요. 기억하기가 더 쉽습니다. – nawfal

+0

예. – nawfal

관련 문제