sql >> Databasteknik >  >> RDS >> Mysql

Kombinera resultat från utvalda frågor utan att använda set-operatorer (UNION)

Låt oss anta att du har två tabeller som du vill UNION

CREATE TABLE Table1
(`id` int, `name` varchar(32));
CREATE TABLE Table2
(`id` int, `name` varchar(32));

Och exempeldata

tabell 1:

| ID |  NAME |
|----|-------|
|  1 | name1 |
|  2 | name2 |
|  3 | name3 |

tabell 2:

| ID |  NAME  |
|----|--------|
| 11 | name11 |
| 22 | name22 |
| 33 | name33 |
|  1 |  name1 |

För att emulera UNION ALL

SELECT COALESCE(t1.id, t2.id) id,
       COALESCE(t1.name, t2.name) name
  FROM 
(
  SELECT TABLE_NAME <> 'table1' n
    FROM INFORMATION_SCHEMA.TABLES
   WHERE TABLE_SCHEMA = SCHEMA()
     AND TABLE_NAME IN('table1', 'table2')
) t LEFT JOIN table1 t1 
    ON t.n = 0 LEFT JOIN table2 t2
    ON t.n = 1 

Utdata:

| ID |   NAME |
|----|--------|
|  1 |  name1 |
|  2 |  name2 |
|  3 |  name3 |
| 11 | name11 |
| 22 | name22 |
| 33 | name33 |
|  1 |  name1 |

För att emulera UNION du behöver bara lägga till DISTINCT

SELECT DISTINCT COALESCE(t1.id, t2.id) id,
       COALESCE(t1.name, t2.name) name
  FROM 
(
  SELECT TABLE_NAME <> 'table1' n
    FROM INFORMATION_SCHEMA.TABLES
   WHERE TABLE_SCHEMA = SCHEMA()
     AND TABLE_NAME IN('table1', 'table2')
) t LEFT JOIN table1 t1 
    ON t.n = 0 LEFT JOIN table2 t2
    ON t.n = 1 

Utdata:

| ID |   NAME |
|----|--------|
|  1 |  name1 |
|  2 |  name2 |
|  3 |  name3 |
| 11 | name11 |
| 22 | name22 |
| 33 | name33 |

Här är SQLFiddle demo



  1. SQLite Inner Join

  2. Exempel på JDBC-uttalande – Infoga, Ta bort, Uppdatera, Välj post

  3. Kan jag göra en mysql Select, Update and Delete i en fråga?

  4. Skickar xml-strängparameter till SQL Server-lagrad procedur