Я внимательно прочитал ваш вопрос и резюмировал ниже:
- Дочерние строки могут существовать до, в или после даты X
- Я хочу, чтобы у всех родителей, у которых есть дети, было свидание в день или раньше.
См. Код ниже. Мы используем оператор HAVING, чтобы убедиться, что у детей нет даты после X.
SELECT P.*
FROM Parent P
WHERE P.id IN
(
SELECT C.parentID
FROM Child C
GROUP BY C.parentID
HAVING MAX(CASE WHEN date > '2010-10-13' THEN 1 ELSE 0 END) = 0
/* do not return children that have a date after 2010-10-13 */
)
Пример схемы для тех, кто хочет подыграть. (SQL Server)
(«дата» называется «mydate», чтобы избежать необходимости зарезервировать слово)
CREATE TABLE Parent (id INT PRIMARY KEY);
CREATE TABLE Child (id INT IDENTITY PRIMARY KEY, parentID INT NOT NULL REFERENCES Parent(id), mydate DATE );
INSERT INTO Parent VALUES (1);
INSERT INTO Parent VALUES (2);
INSERT INTO Parent VALUES (3);
INSERT INTO Parent VALUES (4);
INSERT INTO Child (parentID, mydate) VALUES (1,'2010-10-11')
INSERT INTO Child (parentID, mydate) VALUES (1,'2010-10-12')
INSERT INTO Child (parentID, mydate) VALUES (1,'2010-10-13')
INSERT INTO Child (parentID, mydate) VALUES (2,'2010-10-12')
INSERT INTO Child (parentID, mydate) VALUES (2,'2010-10-13')
INSERT INTO Child (parentID, mydate) VALUES (2,'2010-10-14')
INSERT INTO Child (parentID, mydate) VALUES (3,'2010-10-14')
INSERT INTO Child (parentID, mydate) VALUES (3,'2010-10-15')
INSERT INTO Child (parentID, mydate) VALUES (3,'2010-10-16')