簡體   English   中英

從一張表中選擇不在另一張表中

[英]Select from one table where not in another

我試圖找到一個表中而不是另一個表中的行,兩個表都在不同的數據庫中,並且在我用來匹配的列上也有不同的列名。

我有一個查詢,代碼如下,我認為它可能有效,但它太慢了:

SELECT `pm`.`id`
FROM `R2R`.`partmaster` `pm`
WHERE NOT EXISTS (
    SELECT * 
    FROM `wpsapi4`.`product_details` `pd`
    WHERE `pm`.`id` = `pd`.`part_num`
)

所以查詢試圖做如下:

從 R2R.partmaster 數據庫中選擇不在 wpsapi4.product_details 數據庫中的所有 id。 我匹配的列是 partmaster.id & product_details.part_num

擴展 Sjoerd 的反連接,您還可以使用易於理解的SELECT WHERE X NOT IN (SELECT)模式。

SELECT pm.id FROM r2r.partmaster pm
WHERE pm.id NOT IN (SELECT pd.part_num FROM wpsapi4.product_details pd)

請注意,您只需要在保留字、帶空格的名稱等上使用`反引號,而不是普通的列名稱。

在 MySQL 5+ 上,這種查詢運行得非常快。
在 MySQL 3/4 上它很慢。

確保您在相關字段上有索引
您需要在pm.idpd.part_num上有一個索引。

您可以 LEFT JOIN 兩個表。 如果第二個表中沒有相應的行,則值將為 NULL。

SELECT id FROM partmaster LEFT JOIN product_details ON (...) WHERE product_details.part_num IS NULL

為了擴展 Johan 的答案,如果子選擇中的 part_num 列可以包含空值,則查詢將中斷。

要糾正此問題,請添加空檢查...

SELECT pm.id FROM r2r.partmaster pm
WHERE pm.id NOT IN 
      (SELECT pd.part_num FROM wpsapi4.product_details pd 
                  where pd.part_num is not null)
  • 抱歉,我無法添加評論,因為我沒有代表!

所以網上有很多帖子展示了如何做到這一點,我找到了 3 種方法,與 Johan & Sjoerd 指出的相同。 我無法讓這些查詢中的任何一個工作,很明顯它們工作正常,這是我的數據庫工作不正常,並且這些查詢都運行緩慢。

所以我想出了其他人可能會覺得有用的另一種方法:

它的基本原理是創建一個臨時表並用所有信息填充它,然后刪除另一個表中的所有行。

所以我做了這 3 個查詢,它運行得很快(在幾分鍾內)。

CREATE TEMPORARY TABLE

`database1`.`newRows`

SELECT

`t1`.`id` AS `columnID`

FROM

`database2`.`table` AS `t1`

.

CREATE INDEX `columnID` ON `database1`.`newRows`(`columnID`)

.

DELETE FROM `database1`.`newRows`

WHERE

EXISTS(
    SELECT `columnID` FROM `database1`.`product_details` WHERE `columnID`=`database1`.`newRows`.`columnID`
)

暫無
暫無

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

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