該表可能如下所示:
id | label
----------
1 | red
3 | green
5 | blue
現在,有一組給定的 ID,必須與 DB 進行比較。讓我們說(3, 4, 5)。
我正在尋找一個 SELECT 陳述句,它回傳現有的 ID,包括標簽和不存在的標簽 = null。
所以鑒于(3, 4, 5)我正在尋找這個結果
id | label
----------
3 | green
4 | NULL
5 | blue
我怎樣才能在MySQL/MariaDB 中做到這一點?
在 PostgreSQL 中,它將SELECT FROM (VALUES (3), (4), (5)) t(id)與表的左連接相結合。但是,我沒有找到 MySQL 的替代方案。
uj5u.com熱心網友回復:
使用子查詢作為行內視圖,使用UNION ALL.
SELECT
*
FROM
(
SELECT 3 AS id
UNION ALL SELECT 4
UNION ALL SELECT 5
)
AS params
LEFT JOIN
some_table
ON some_table.id = params.id
或者依靠擁有強大的維度表。
例如,用戶可能有也可能沒有表中的條目favourite_fruit,但fruit可以依賴該表來完全填充。
SELECT
*
FROM
user
CROSS JOIN
fruit
LEFT JOIN
favourite_fruit
ON favourite_fruit.user_id = user.id
AND favourite_fruit.fruit_id = fruit.id
WHERE
user.id IN (1,2,3)
AND fruit.id IN (3,4,5)
uj5u.com熱心網友回復:
鑒于問題被標記為 瑪麗亞資料庫,請注意它確實支持VALUES. 在 MariaDB 10.3 上檢查:
WITH u(id) AS (VALUES (3), (4), (5))
SELECT u.id, t.label
FROM u LEFT JOIN t ON u.id = t.id;
| ID | 標簽 |
|---|---|
| 3 | 綠色 |
| 4 | 空值 |
| 5 | 藍色 |
uj5u.com熱心網友回復:
在 MySql 8.0 中,您可以使用ROW() 建構式執行相同操作:
SELECT c.id, t.label
FROM ((VALUES ROW(3), ROW(4), ROW(5))) c(id)
LEFT JOIN tablename t
ON t.id = c.id;
或者使用 CTE:
WITH cte(id) AS (VALUES ROW(3), ROW(4), ROW(5))
SELECT c.id, t.label
FROM cte c LEFT JOIN tablename t
ON t.id = c.id;
請參閱演示。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/322800.html
