1

以下 3 个表格都有一个“ date_v_end”字段,即有效日期。只要它是NULL这意味着它是当前的“好”值。

例如,要选择表的当前值,categorie我们可以简单地执行SELECT * FROM categorie WHERE date_v_end IS NULL.

我有 3 张桌子:

  • 一张桌子categorie(英文分类)
  • 一个表“一对多” categorie_produit(类别 <=> 英文产品)
  • 一张桌子produit(英文产品)

我想查询所有current 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;

这可以正常工作,除非在一种情况下:当有 acategorie_produit 并且它的“ date_v_end不是 NULL:在添加这个该死的“ ”字段之前,date_v_end我得到了一行填充了 c_id 、c_titre 和 c_description 以及其他字段NULL( 、、、、、 )的行。现在没有结果。cp_id_categoriecp_id_produitp_idp_titrep_description

我真的不知道如何修改我的查询以使其正常工作。任何想法?

4

1 回答 1

1

您需要将IS NULL支票移动到 JOIN 中。

在你加入的版本中,不管date_v_fin字段,然后过滤结果。

在下面的查询中,仅当 date_v_fin 字段为 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 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
于 2012-04-23T15:32:47.513 回答