sql - 合并多列

扫码查看

我有三个简单的表,如下所示:

+----+-------------+  +----+-----------+  +----+---------------+
| artists          |  | albums         |  | songs              |
+----+-------------+  +----+-----------+  +----+---------------+
| id | name        |  | id | name      |  | id | name          |
+----+-------------+  +----+-----------+  +----+---------------+
| 0  | The Beatles |  | 0  | Help!     |  | 0  | Help!         |
| 1  | Metallica   |  | 1  | Metallica |  | 1  | Enter Sandman |
+----+-------------+  +----+-----------+  +----+---------------+

我想查询导致以下结果:
+--------+---------------+
| type   | name          |
+--------+---------------+
| artist | The Beatles   |
| artist | Metallica     |
| album  | Help!         |
| album  | Metallica     |
| song   | Help!         |
| song   | Enter Sandman |
+--------+---------------+

我正在尝试使用LIKE查询来搜索艺术家,专辑和歌曲。

现在,我使用下面的SQL从三列中获取结果,然后使用Ruby将它们组合到一个对象中。我认为使用纯SQL而不是使用解释语言返回结果会更加有效。
SELECT name FROM artists WHERE name LIKE 'something%'
SELECT name FROM albums WHERE name LIKE 'something%'
SELECT name FROM songs WHERE name LIKE 'something%'

我对SQL不太了解,并且已经为此苦苦挣扎了几天,并且想知道这里是否有人可以为我指明正确的方向。

最佳答案

正如其他人建议的那样,您可以使用UNION。但是,UNION的语义迫使数据库消除通常需要排序操作的重复行。由于您知道每个查询都必须返回非重复的行,因此使用UNION ALL会更有效。就像是

SELECT *
  FROM (SELECT 'artists' as type, name
          FROM artists
        UNION ALL
        SELECT 'albums' as type, name
          FROM albums
        UNION ALL
        SELECT 'songs' as type, name
          FROM songs)
 WHERE name LIKE 'something%'

无论使用哪种数据库引擎,都应该能够将NAME上的谓词推入被UNION ALL连接在一起的三个分支中的每个分支。但是值得在查询计划中进行确认。

10-05 20:44
查看更多