2012-04-23 27 views
1

以下所有表格都有一個「date_v_end」字段,這是一個有效日期。只要它是NULL這意味着它是當前的「良好」價值。SQL查詢,有效日期和連接:如何使其工作?

例如,要選擇表categorie的當前值,我們可以簡單地執行SELECT * FROM categorie WHERE date_v_end IS NULL

我有3個表:

  • categorie(英文類別)
  • 表 「一對多」 categorie_produit(類別< =>產物爲英文)
  • produit(產品英文)

我想查詢當前的所有categories以及他們的一對多produit和我仍然需要一個結果即使該類別沒有產品(=沒有produit_categorie行)。

之前具有「date_v_end」字段我就是這麼做的:

SELECT 
    c.id AS c_id, 
    c.titre AS c_titre, 
    c.description AS c_description, 
    cp.id_categorie AS cp_id_categorie, 
    cp.id_produit AS cp_id_produit, 
    p.id AS p_id, 
    p.titre AS p_titre, 
    p.description AS p_description 
FROM categorie_produit cp 
LEFT OUTER JOIN categorie c 
ON c.id=cp.id_categorie 
LEFT OUTER JOIN produit p 
ON p.id=cp.id_produit 
ORDER BY c_id,p_id; 

它的工作就像一個魅力。現在我試圖用新的「date_v_end」字段修改查詢。我已經添加了三個條款WHERE c.date_v_fin IS NULL AND cp.date_v_fin IS NULL AND p.date_v_fin IS NULL。你去那裏:

SELECT 
    c.id AS c_id, 
    c.titre AS c_titre, 
    c.description AS c_description, 
    cp.id_categorie AS cp_id_categorie, 
    cp.id_produit AS cp_id_produit, 
    p.id AS p_id, 
    p.titre AS p_titre, 
    p.description AS p_description 
FROM categorie_produit cp 
LEFT OUTER JOIN categorie c 
ON (c.id=cp.id_categorie AND c.date_v_fin IS NULL) 
LEFT OUTER JOIN produit p 
ON (p.id=cp.id_produit AND p.date_v_fin IS NULL) 
WHERE cp.date_v_fin IS NULL 
ORDER BY c_id,p_id; 

這個工程除了在一種情況下罰款:當有一個categorie_produit其「date_v_end」是NULL:加入這個該死的「date_v_end」字段中,我得到了一個前行填充了c_id,c_titre和c_description,其他字段爲NULLcp_id_categorie,cp_id_produit, p_id,p_titre,p_description)。現在沒有結果。

我真的不知道如何修改我的查詢來使其工作。任何想法?

+0

難道你不希望該行反正,因爲它是無效的?或者你甚至沒有得到'正確'的行?除此之外,不會將與WHERE子句的比較添加到「INNER JOIN」(有效地) - 將「cp.date_v_fin」和「p.date_v_fin」檢查移到它們各自的「JOIN」子句中怎麼辦? – 2012-04-23 15:38:34

回答

1

您需要將IS NULL支票移入JOIN中。

在您的版本中,您將加入,無論date_v_fin字段是什麼,然後過濾結果。

在下面的查詢中,只有在date_v_fin字段爲空時纔會加入記錄。

SELECT 
    c.id AS c_id, 
    c.titre AS c_titre, 
    c.description AS c_description, 
    cp.id_categorie AS cp_id_categorie, 
    cp.id_produit AS cp_id_produit, 
    p.id AS p_id, 
    p.titre AS p_titre, 
    p.description AS p_description 
FROM 
    categorie c 
LEFT OUTER JOIN 
    categorie_produit cp 
    ON c.id=cp.id_categorie 
    AND cp.date_v_fin IS NULL 
LEFT OUTER JOIN 
    produit p 
    ON p.id=cp.id_produit 
    AND p.date_v_fin IS NULL 
WHERE 
    c.date_v_fin IS NULL 
ORDER BY 
    c_id, 
    p_id 
+0

這是令人難以置信的。我覺得很愚蠢。我一直在爲它工作超過2個小時,因爲我不想問在stackoverflow(驕傲的問題)。看到像你這樣的人用正確的答案回答得這麼快,幾乎是屈辱的;''**' – 2012-04-23 15:37:58

+0

我們都被有時顯而易見的矇蔽了。好吧,我被最明顯的*大部分時間矇蔽了...... – MatBailie 2012-04-23 15:40:12

+0

我認爲這兩種方式都有效。儘管我們可以通過顯而易見的方式獲得*盲目的認知,但我們也有機會通過指出顯而易見的事物來展示我們對精神領域的敏銳和對問題的滲透。然後得到@ Olivier的可疑讚美。 :) – 2012-04-23 18:05:51