簡體   English   中英

MySQL查詢以獲取不屬於另一個表的所有項目

[英]MySQL query to get all items that do not belong to another table

我有一個問題,有幾個小時無法解決。

我有3張桌子:

  • Process

    \n + ---- + ---------- + ---------------- + -------- + ------- ------ + --------------- + ------------- + --------- + --- --- +\n |  id |  名稱|  描述|  活躍  負責任|  notifyByEmail |  notifyBySms |  備注|  圖標|\n + ---- + ---------- + ---------------- + -------- + ------- ------ + --------------- + ------------- + --------- + --- --- +\n |  4 |  流程1 |  TestDecriptino |  1 |  0 |  0 |  0 |  0 |  NULL |\n |  5 |  Process2 |  測試  0 |  0 |  0 |  0 |  測試  NULL |\n |  6 |  Process3 |  12322 |  1 |  0 |  0 |  0 |  12322 |  NULL |\n |  7 |  Process4 |  222222222222 |  0 |  0 |  0 |  0 |  2222222 |  NULL |\n |  9 |  Process5 |  sgdasad |  1 |  0 |  1 |  0 |  dhds |  NULL |\n + ---- + ---------- + ---------------- + -------- + ------- ------ + --------------- + ------------- + --------- + --- --- +\n
  • Systems

    \n + ---- + --------- + ------------- + -------- + ----------- -------- + -------- + ------------- + --------- +  - ----- +\n |  id |  名稱|  描述|  活躍  liabilityUserId |  notifyByEmail |  notifyBySms |  備注|  圖標|\n + ---- + --------- + ------------- + -------- + ----------- -------- + -------- + ------------- + --------- +  - ----- +\n |  2 |  Sistem1 |  fdjgf |  1 |  1 |  1 |  1 |  0 |  NULL |\n |  6 |  Sistem2 |  koam |  0 |  3 |  1 |  0 |  SADGS |  NULL |\n + ---- + --------- + ------------- + -------- + ----------- -------- + -------- + ------------- + --------- +  - ----- +\n
  • Process_Systems

    \n + ---- + ----------- + ---------- + -------- + --------- +\n |  id |  processId |  systemId |  活躍  備注|\n + ---- + ----------- + ---------- + -------- + --------- +\n |  4 |  4 |  2 |  1 |  aa |\n |  8 |  7 |  2 |  1 |  aa |\n |  11 |  9 |  2 |  1 |  aa |\n |  15 |  4 |  6 |  0 |  aa |\n + ---- + ----------- + ---------- + -------- + --------- +\n

我有哪些方法processID是一個參數,並且必須以某種方式過濾所有Process_Systems由ID,然后讓Systems不屬於Process_Systems表。

  • 一種方法是使用NOT IN子查詢

     SELECT * FROM Systems WHERE id NOT IN ( SELECT systemid FROM Process_Systems WHERE processId = ? ); 
  • 另一種方法是使用NOT EXISTS子查詢

     SELECT * FROM Systems WHERE NOT EXISTS ( SELECT * FROM Process_Systems WHERE systemId = Systems.id AND processId = ? ); 
  • 第三種方法是使用外部聯接

     SELECT Systems.* FROM Systems LEFT JOIN Process_Systems ps ON ps.systemId = Systems.id AND ps.processId = ? WHERE ps.systemId IS NULL; 

sqlfiddle上看到它們。

有關各自性能差異的分析,請參見@Quassnoi的博客文章:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM