SQL-запрос для выбора из двух таблиц с условием if - PullRequest
1 голос
/ 20 декабря 2011

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

Tables: Notification        Acknowledgment

fields: id, notifier        id, parent_id, status

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

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

Я могу разбить его на более простые запросы и добиться этого, но я бы хотел знать один-единственный запрос, чтобы это сделать ..

Ответы [ 3 ]

1 голос
/ 20 декабря 2011
SELECT n.* FROM Notification n
LEFT OUTER JOIN Acknowledgment a ON a.parent_id=n.id
WHERE a.status IS NULL OR a.status=@someValue
1 голос
/ 20 декабря 2011

В качестве альтернативы LEFT OUTER JOINS вы можете использовать предложение EXISTS .

. Например:

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 (особенно там, где, как в моем примере, вы используете более одного в одной таблице), я просто упомяну эту альтернативу, поскольку это более прямой перевод вашего псевдопросмотра.

1 голос
/ 20 декабря 2011
  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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...