2010-11-06 111 views
0

我有一個一對多的關係,看起來像這樣:SQL子關係查詢幫助

| Parent | | Child | 
| id | | id | 
|  | |parentID| 
|  | | date | 

,我試圖構建一個查詢,這樣我得到的所有誰生孩子記錄這一切都已父母指定日期之前的日期。

像這樣的事情

SELECT * FROM parent 
JOIN child on child.parentid = parent.id 
WHERE child.date <= '10/13/2010' 

但這個問題是我得到的是有規定的日期之前的日期兒童和有孩子的記錄與指定的日期之後的日期的父母,當我只想要在給定日期之前有一個日期的孩子的父母。

有沒有人對如何處理這種情況有一些建議?

謝謝!

回答

2

用途:

SELECT p.* 
    FROM PARENT p 
WHERE EXISTS(SELECT NULL 
       FROM CHILD c 
       WHERE c.parentid = p.id 
       AND c.date <= '2010-10-13') 
    AND NOT EXISTS(SELECT NULL 
        FROM CHILD c 
        WHERE c.parentid = p.id 
        AND c.date > '2010-10-13') 

每個人都會告訴你使用連接「因爲他們更快」,但一般他們不知道用他們的影響 - 如果你不這樣做需要支持表中的信息,你不應該加入到它。這是因爲在這種情況下不止一個孩子會產生重複的PARENT記錄。 JOIN和DISTINCT或GROUP BY與IN或EXISTS之間的權衡可能是平等的,但沒有適當處理重複數據的麻煩。

+0

這是不是仍然拉有孩子既是父母在給定日期之前的日期和之後的日期?我只想要父母帶着孩子約會前的時間 – Jimmy 2010-11-06 20:47:59

+0

@Jimmy:查看更新的答案。 – 2010-11-06 20:50:11

+0

你是冠軍,不知道存在的運算符,並在sql中選擇null。非常感謝! – Jimmy 2010-11-06 20:54:36

2
SELECT 
    * 
FROM 
    Parent 
WHERE 
    EXISTS (SELECT * FROM Child WHERE Child.ParentId = Parent.Id AND [date] <= '2010-10-13') 
    AND 
    NOT EXISTS (SELECT * FROM Child WHERE Child.ParentId = Parent.Id AND [date] > '2010-10-13') 
0

我詳細閱讀你的問題,總結如下:

  • 子行之前可能存在,或者日期X之後
  • 我想誰的孩子所有的父母都對/之前的日期日期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') 
+0

我應該注意到,這是一張通過Child表嗎? – beach 2010-11-06 22:52:24