sql >> Database teknologi >  >> RDS >> Mysql

MySql-forespørgsel for at få alle kombinationer af to kolonner med NULL, hvis der ikke er nogen matchende post

Din første ydre join producerer som forventet:

| REASON |  MONTH |
-------------------
|      A |    May |
|      A |    May |
|      A |   July |
|      A |   June |
|      B |    May |
|      B |   June |
|      D | (null) |

Men fordi ydre joinforbindelser giver resultater, hvis join-betingelsen er opfyldt mindst én gang (og indfør kun NULL registrerer, hvis betingelsen er aldrig tilfreds), din anden ydre joinforbindelseikke producere en post for (B, July); den taber også Reason = 'D' helt, fordi sammenføjningsbetingelsen ikke er opfyldt (og alle tre måneder er blevet opfyldt andre steder):

| REASON | MONTH |
------------------
|      A |   May |
|      A |   May |
|      B |   May |
|      A |  June |
|      B |  June |
|      A |  July |

Mens du kunne løse tabet af Reason = 'D' ved at tilføje OR a.Month IS NULL til din deltagelsesbetingelse vil du stadig ikke producere (B, July) . I stedet fordi du ønsker at få hvert par (Reason, Month) , skal du CROSS JOIN dine materialiserede Reasons tabel med din materialiserede Months tabel:

SELECT Reason, Month
FROM   
  (
    SELECT 'A' AS Reason
    UNION ALL SELECT 'B'
    UNION ALL SELECT 'D'
  ) Reasons CROSS JOIN (
    SELECT 'May' AS Month
    UNION ALL SELECT 'June'
    UNION ALL SELECT 'July'
  ) Months
| REASON | MONTH |
------------------
|      A |   May |
|      B |   May |
|      D |   May |
|      A |  June |
|      B |  June |
|      D |  June |
|      A |  July |
|      B |  July |
|      D |  July |

Se den på sqlfiddle .

Du skal så blot ydre sammenføj resultatet med dine underliggende data:

SELECT Reason, Month, SUM(Down_time) downtime
FROM   
  (
    SELECT 'A' AS Reason
    UNION ALL SELECT 'B'
    UNION ALL SELECT 'D'
  ) Reasons CROSS JOIN (
    SELECT 'May' AS Month
    UNION ALL SELECT 'June'
    UNION ALL SELECT 'July'
  ) Months
  LEFT JOIN tabledown USING (Reason, Month)
GROUP BY Reason, Month
| REASON | MONTH | DOWNTIME |
-----------------------------
|      A |  July |        3 |
|      A |  June |        8 |
|      A |   May |        7 |
|      B |  July |   (null) |
|      B |  June |        6 |
|      B |   May |        5 |
|      D |  July |   (null) |
|      D |  June |   (null) |
|      D |   May |   (null) |

Se den på sqlfiddle .




  1. Postgres IKKE I ydelse

  2. Retur eksisterer ikke post i tabellen

  3. Hent kun kolonnenavne som i array mysql

  4. Aritmetisk overløbsfejl ved konvertering af udtryk til datatype int