![](/img/trans.png)
[英]SQL JOIN with WHERE condition when two rows' values are the same and one row matches to two different rows
[英]join two rows with different values in a single row
在一行中獲取兩條記錄
嘗試子句 group by 未獲得所需結果。
我有三個表: 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
您可以使用條件聚合。 您只需要修改您的查詢以使用諸如MAX()
類的聚合函數包圍CASE
s( 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;
通常,使用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
。
謝謝您的回答。 我終於用連接修復了它:
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;
最良好的問候。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.