首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Oracle SQL 查詢:排除兩表聯結字段相同的記錄

     編輯:程式設計綜合問答

需求

表 A(Aname, Aaspath)與表 B(Bname, Baspath),查詢 A 中 Aname || Aaspath 不等於 B 中 Bname || Baspath 的記錄。

標準寫法

SELECT *
FROM A1
WHERE Aname || Aaspath NOT IN (
    SELECT Bname || Baspath
    FROM B1
);

測試數據驗證

-- A1
1 少女1 住址1
2 少女2 住址2
3 少女3 住址3
8 少女8 住址8
7 少女7 住址7

-- B1
1 少女1 住址1
2 少女2 住址2
5 少女5 住址5
6 少女6 住址6

-- 結果
3 少女3 住址3
8 少女8 住址8
7 少女7 住址7

效能優化建議

  • 若數據量大,NOT IN 可能因 NULL 值導致全表掃描,改用 NOT EXISTS:
    SELECT *
    FROM A1 a
    WHERE NOT EXISTS (
        SELECT 1 FROM B1 b
        WHERE b.Bname || b.Baspath = a.Aname || a.Aaspath
    );
    
  • 為聯結字段創建函數索引:CREATE INDEX idx_a_concat ON A1(Aname || Aaspath);
  • 避免在 WHERE 條件中對列進行運算,可考慮物化視圖或冗余列存儲拼接值

注意事項

  1. 確保拼接字段類型一致,必要時 TO_CHAR 轉換
  2. 若字段含 NULL,|| 會導致整體為 NULL,需用 NVL 處理
  3. Oracle 12c+ 可用 FETCH FIRST n ROWS ONLY 分頁
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved