在一行中获取两个记录
尝试通过子句分组,但未获得所需结果。
我有三个表:direccion
,punto_suministro
,r_servicio_punto_suministro
。
id_direccion others_fields
10 XXX
10 YYY
id_punto_suministro id_r_servicio_punto_suministro
6 1
7 2
id_r_servicio_punto_suministro id_servicio_gas id_servicio_luz
1 6 null
2 null 7
查询:
SELECT
punto_suministro.id_direccion,
CASE WHEN r_servicio_punto_suministro.id_servicio_gas IS NOT NULL THEN punto_suministro.id_punto_suministro END AS Gas,
CASE WHEN r_servicio_punto_suministro.id_servicio_luz IS NOT NULL THEN punto_suministro.id_punto_suministro END AS Luz
FROM
direccion
LEFT JOIN punto_suministro ON direccion.id_direccion = punto_suministro.id_direccion
LEFT JOIN r_servicio_punto_suministro ON punto_suministro.id_r_servicio_punto_suministro = r_servicio_punto_suministro.id_r_servicio_punto_suministro
LEFT JOIN servicio_gas ON r_servicio_punto_suministro.id_servicio_gas = servicio_gas.id_servicio_gas
LEFT JOIN servicio_luz ON r_servicio_punto_suministro.id_servicio_luz = servicio_luz.id_servicio_luz
WHERE direccion.id_direccion = 10;
查询返回两行:
id_direccion Gas Luz
10 6 null
10 null 7
我希望将结果记录在一个记录中
id_direccion Gas Luz
10 6 7
最诚挚的问候。
答案 0 :(得分:1)
您可以使用条件聚合。您只需要修改查询以使CASE
周围包含诸如MAX()
之类的聚合函数(MIN()
同样可以完成工作),并在以下位置添加GROUP BY
子句结束:
SELECT
punto_suministro.id_direccion,
MAX(CASE WHEN r_servicio_punto_suministro.id_servicio_gas IS NOT NULL THEN punto_suministro.id_punto_suministro END) AS Gas,
MAX(CASE WHEN r_servicio_punto_suministro.id_servicio_luz IS NOT NULL THEN punto_suministro.id_punto_suministro END) AS Luz
FROM
direccion
LEFT JOIN punto_suministro ON direccion.id_direccion = punto_suministro.id_direccion
LEFT JOIN r_servicio_punto_suministro ON punto_suministro.id_r_servicio_punto_suministro = r_servicio_punto_suministro.id_r_servicio_punto_suministro
LEFT JOIN servicio_gas ON r_servicio_punto_suministro.id_servicio_gas = servicio_gas.id_servicio_gas
LEFT JOIN servicio_luz ON r_servicio_punto_suministro.id_servicio_luz = servicio_luz.id_servicio_luz
WHERE direccion.id_direccion = 10
GROUP BY punto_suministro.id_direccion;
答案 1 :(得分:1)
通常,使用LEFT JOIN
进行聚合时,您希望按第一个表中的值进行聚合。
因为您使用的是LEFT JOIN
,所以我猜想即使WHERE
子句上没有匹配项,也要返回一行。
要确保一行,请使用不带GROUP BY
的聚合查询:
SELECT MAX(d.id_direccion) as id_direccion,
MAX(CASE WHEN sps.id_servicio_gas IS NOT NULL THEN ps.id_punto_suministro END) AS Gas,
MAX(CASE WHEN sps.id_servicio_luz IS NOT NULL THEN ps.id_punto_suministro END) AS Luz
FROM direccion d LEFT JOIN
punto_suministro ps
ON d.id_direccion = ps.id_direccion LEFT JOIN
r_servicio_punto_suministro sps
ON ps.id_r_servicio_punto_suministro = sps.id_r_servicio_punto_suministro LEFT JOIN
servicio_gas sg
ON sps.id_servicio_gas = sg.id_servicio_gas LEFT JOIN
servicio_luz sl
ON spm.id_servicio_luz = sl.id_servicio_luz
WHERE d.id_direccion = 10;
如果您知道数据中存在10
,则可以使用GROUP BY d.id_direccion
。
答案 2 :(得分:0)
谢谢您的回答。 我终于用联接修复了它:
SELECT
direccion.id_direccion,
cups_gas.id_punto_suministro AS Gas,
cups_luz.id_punto_suministro AS Luz
FROM
direccion
INNER JOIN
(SELECT
cups,
id_direccion,
punto_suministro.id_punto_suministro,
atr,
ca,
fecha_fin
FROM
punto_suministro
INNER JOIN r_servicio_punto_suministro ON r_servicio_punto_suministro.id_r_servicio_punto_suministro = punto_suministro.id_r_servicio_punto_suministro
INNER JOIN servicio_gas ON r_servicio_punto_suministro.id_servicio_gas = servicio_gas.id_servicio_gas
INNER JOIN r_contrato_punto_suministro ON punto_suministro.id_punto_suministro = r_contrato_punto_suministro.id_punto_suministro
INNER JOIN contrato ON r_contrato_punto_suministro.id_contrato = contrato.id_contrato
INNER JOIN r_servicio_contrato ON contrato.id_contrato = r_servicio_contrato.id_contrato
INNER JOIN servicio ON r_servicio_contrato.id_servicio = servicio.id_servicio) cups_gas ON direccion.id_direccion = cups_gas.id_direccion
INNER JOIN
(SELECT
cups,
id_direccion,
punto_suministro.id_punto_suministro,
atr,
ca,
fecha_fin
FROM
punto_suministro
INNER JOIN r_servicio_punto_suministro ON r_servicio_punto_suministro.id_r_servicio_punto_suministro = punto_suministro.id_r_servicio_punto_suministro
INNER JOIN servicio_luz ON r_servicio_punto_suministro.id_servicio_luz = servicio_luz.id_servicio_luz
INNER JOIN r_contrato_punto_suministro ON punto_suministro.id_punto_suministro = r_contrato_punto_suministro.id_punto_suministro
INNER JOIN contrato ON r_contrato_punto_suministro.id_contrato = contrato.id_contrato
INNER JOIN r_servicio_contrato ON contrato.id_contrato = r_servicio_contrato.id_contrato
INNER JOIN servicio ON r_servicio_contrato.id_servicio = servicio.id_servicio) cups_luz ON direccion.id_direccion = cups_luz.id_direccion
WHERE
direccion.id_direccion = 10;
最诚挚的问候。