sql >> Databáze >  >> RDS >> Mysql

Dotaz MySql pro získání všech kombinací dvou sloupců s NULL, pokud neexistuje žádný odpovídající záznam

Vaše první vnější připojení , jak se očekávalo, produkuje:

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

Protože však vnější spojení produkují výsledky, pokud je podmínka spojení splněna alespoň jednou (a zaveďte pouze NULL záznamy, pokud je podmínka nikdy spokojen), vaše druhé vnější připojení pak není vytvořit záznam pro (B, July); také vypadne Reason = 'D' úplně, protože podmínka spojení není splněna (a všechny tři měsíce byly splněny jinde):

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

Zatímco mohli vyřešit ztrátu Reason = 'D' přidáním OR a.Month IS NULL k vaší podmínce připojení, stále nevyrobíte (B, July) . Místo toho, protože chcete získat každý pár (Reason, Month) , musíte CROSS JOIN vaše zhmotněné Reasons tabulka s vašimi zhmotněnými Months tabulka:

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 |

Podívejte se na sqlfiddle .

Pak potřebujete pouze vnější spojení výsledku s vašimi podkladovými daty:

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) |

Podívejte se na sqlfiddle .




  1. java.sql.SQLException:Výjimka Io:Přerušené potrubí, jak obnovit bez restartu?

  2. Optimalizujte dotaz na vlastní připojení MySQL

  3. Zašifrujte data v postgresql

  4. Vrácení hodnot z mapovaných metod MyBatis <insert>