[英]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上,我得到了以下信息:
最后,这是我得到的结果:
问题是,怎么可能在第一个小时和第二个小时没有得到行? 我正在使用LEFT OUTER JOIN,但似乎无法正常工作。
提前非常感谢您的帮助
您的WHERE
子句指出(id_magnitud = 1)
。 Calender
中任何未连接到CLIENT_MEDIDAS_COGEN
的id_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.