2011-12-20 2 views
1

У меня есть две таблицы Уведомление и подтверждение. Подтверждение имеет поле, которое содержит первичный ключ таблицы уведомлений. В основном уведомление будет иметь много Благодарности.SQL-запрос для выбора из двух таблиц с условием if

Tables: Notification  Acknowledgment 

fields: id, notifier  id, parent_id, status 

Теперь я должен выбрать строки из Notification, что:

  1. нет Квитирования WHERE Acknowledment.parent_id = Notification.id (в основном не признавался для конкретного уведомления) // или
  2. если есть Подтверждение для уведомления, затем выберите Уведомление, если какое-либо из выражений с parent_id = Notification.id имеет Acknowledgement.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

@ Ответ Ахиля имеет a.id IS NULL вместо a.status в вашем коде. Это нормально, потому что там не будет такой строки? – 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 s имеют тенденцию быть лучше оптимизирован в SQL (особенно там, где, как в моем примере, вы используете более чем один на одном столе), я просто упомянуть эту альтернативу поскольку это более прямой перевод вашего псевдо-запроса.

+0

Спасибо .. это другое и более простое, но более подробное.Спасибо, что дал мне знать эти ключевые слова. Его легче запомнить – nawfal

+0

Да, я понимаю, что .. – nawfal

Смежные вопросы