簡體   English   中英

在一行中連接具有不同值的兩行

[英]join two rows with different values in a single row

在一行中獲取兩條記錄

嘗試子句 group by 未獲得所需結果。

我有三個表: direccionpunto_suministror_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.

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