簡體   English   中英

左外連接似乎無法正常工作

[英]Left Outer Join doesn't seem to work properly

我得到了這段sql server 2005代碼:

SELECT DT, a.id_uf, hora
FROM CALENDAR c LEFT OUTER JOIN CLIENT_MEDIDAS_COGEN a ON a.fecha_oferta = dt AND a.hora = c.H
WHERE 
(id_tipo_medida IN (6, 1)) AND (id_magnitud = 1) 
AND (DT BETWEEN '10/01/2013' AND '10/01/2013') AND (id_tipo_fact = 3)
ORDER BY DT, a.id_uf, a.hora

在日歷上,我有這樣的東西:

日歷

在CLIENT_MEDIDAS_COGEN上,我得到了以下信息:

CLIENT_MEDIDAS_COGEN

最后,這是我得到的結果:

結果

問題是,怎么可能在第一個小時和第二個小時沒有得到行? 我正在使用LEFT OUTER JOIN,但似乎無法正常工作。

提前非常感謝您的幫助

您的WHERE子句指出(id_magnitud = 1) Calender中任何未連接到CLIENT_MEDIDAS_COGENid_magnitude列中將為NULL

SELECT 
    c.DT, 
    a.id_uf,
    c.hora
FROM 
    CALENDAR c 
    LEFT OUTER JOIN CLIENT_MEDIDAS_COGEN a ON a.fecha_oferta = dt AND a.hora = c.H
WHERE 
    (c.DT BETWEEN '10/01/2013' AND '10/01/2013') 
AND (COALESCE(a.id_tipo_medida, 1) IN (6, 1)) 
AND (COALESCE(a.id_magnitud, 1) = 1) 
AND (COALESCE(a.id_tipo_fact, 3) = 3)
ORDER BY 
    c.DT, a.id_uf, a.hora

另外,不要只對通用列使用表別名。 將它們用於所有列,以便清楚地知道列的位置。

根據MatBaille的評論,將CLIENT_MEDIDAS_COGEN上的過濾器CLIENT_MEDIDAS_COGEN join子句會更好。 上面的合並陳述僅表示您問題的原因。 以下可能會表現更好。

SELECT 
    c.DT, 
    a.id_uf,
    c.hora
FROM 
    CALENDAR c 
    LEFT OUTER JOIN CLIENT_MEDIDAS_COGEN a ON 
            a.fecha_oferta = dt 
            AND a.hora = c.H 
            AND (a.id_tipo_medida IN (6, 1)) 
            AND (a.id_magnitud = 1) 
            AND (a.id_tipo_fact = 3)
WHERE 
    (c.DT BETWEEN '10/01/2013' AND '10/01/2013') 
ORDER BY 
    c.DT, a.id_uf, a.hora

這是因為過濾器使它像內部聯接一樣工作。 您可以將過濾器移至加入條件的位置,如下所示:

SELECT c.ID, a.id_uf, c.H
FROM CALENDAR c LEFT OUTER JOIN CLIENT_MEDIDAS_COGEN a ON a.fecha_oferta = dt AND a.hora = c.H
AND 
(a.id_tipo_medida IN (6, 1)) AND (a.id_magnitud = 1) AND (a.id_tipo_fact = 3)
WHERE (DT BETWEEN '10/01/2013' AND '10/01/2013') 
ORDER BY DT, a.id_uf, a.hora

這將產生所需的左連接效果。

Cleaner(我認為)是在LEFT OUTER JOIN之前使用子查詢將條件應用於聯接中的右表。

變成...

SELECT c.ID, a.id_uf, c.H
FROM CALENDAR c 
    LEFT OUTER JOIN 
        (
            SELECt id_uf, hora, fecha_oferta 
            FROM CLIENT_MEDIDAS_COGEN a 
            WHERE (id_tipo_medida IN (6, 1)) AND (id_magnitud = 1) AND (id_tipo_fact = 3)
        ) a ON a.fecha_oferta = dt AND a.hora = c.H

WHERE (DT BETWEEN '10/01/2013' AND '10/01/2013') 
ORDER BY DT, a.id_uf, a.hora

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM