三表關聯查詢:table1 (id1) → table2 (id2, id1, no) → table3 (no, name)。當 table2.no 為 NULL 時,INNER JOIN table3 ON t2.no = t3.no 會過濾掉這些行,導致 name 缺失。需改用外連接並處理空值。
SELECT t3.name
FROM table1 t1 (NOLOCK)
INNER JOIN table2 t2 (NOLOCK) ON t1.id1 = t2.id1
INNER JOIN table3 t3 (NOLOCK) ON t2.no = t3.no;
SELECT t3.name
FROM table1 t1 (NOLOCK)
INNER JOIN table2 t2 (NOLOCK) ON t1.id1 = t2.id1
LEFT JOIN table3 t3 (NOLOCK) ON t2.no = t3.no;
t2.no 為 NULL 時,t3.name 返回 NULL,但 t1/t2 行保留。COALESCE(t3.name, '無名稱') AS name。-- SQL Server
INNER JOIN table3 t3 (NOLOCK) ON t2.no = ISNULL(t3.no, '')
-- MySQL / PostgreSQL
INNER JOIN table3 t3 ON t2.no = COALESCE(t3.no, '')
NULL 強行匹配空字符串,可能產生錯誤關聯。SELECT t1.id1,
(SELECT t3.name FROM table3 t3 WHERE t3.no = t2.no) AS name
FROM table1 t1
INNER JOIN table2 t2 ON t1.id1 = t2.id1;
NULL 時不影響主查詢行數。COALESCE/ISNULL 給業務友好默認值。table2.no 是否應設置 NOT NULL 或外鍵約束,從源頭治理數據質量。NOLOCK (READ UNCOMMITTED) 可能讀到臟數據,核心業務慎用。