需求:供應商表 t_supplier、商品表 t_goods (一對多)。查詢所有供應商,各取任意一個商品關聯。
CREATE TABLE t_supplier (id INT PRIMARY KEY, name VARCHAR(50));
CREATE TABLE t_goods (Id INT AUTO_INCREMENT PRIMARY KEY, Supplier_Id INT, Name VARCHAR(50), FOREIGN KEY (Supplier_Id) REFERENCES t_supplier(id));
INSERT INTO t_supplier VALUES (1,'天津供應商'), (2,'北京供應商');
INSERT INTO t_goods VALUES (1,1,'天津產品1'), (2,1,'天津產品2'), (3,2,'北京產品1'), (4,2,'北京產品2');
SELECT * FROM t_supplier s
LEFT JOIN t_goods g ON g.Supplier_Id = s.id
GROUP BY s.id;
所有供應商各出現一次,t_goods 欄位取該群組第一筆(MySQL 允許非聚合/非 GROUP BY 欄位出現在 SELECT,自動取任一值)。
其他資料庫 (PostgreSQL, Oracle, SQL Server, SQLite 新版) 嚴格禁止 此寫法,會報錯。需改用子查詢、窗口函數 ROW_NUMBER() 或聚合函數明確指定取值邏輯。
-- 子查詢取第一筆
SELECT s.*,
(SELECT g.Name FROM t_goods g WHERE g.Supplier_Id = s.id LIMIT 1) AS goods_name
FROM t_supplier s;
-- 窗口函數 (MySQL 8.0+)
SELECT * FROM (
SELECT s.*, g.Name, ROW_NUMBER() OVER (PARTITION BY s.id ORDER BY g.Id) AS rn
FROM t_supplier s LEFT JOIN t_goods g ON g.Supplier_Id = s.id
) t WHERE rn = 1;