sql語法 - mysql t-sql



從一個表中選擇不在另一個表中 (3)

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

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

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


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

SELECT id FROM partmaster LEFT JOIN product_details ON (...) WHERE product_details.part_num IS 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`
)

要擴展Johan的答案,如果子選擇中的part_num列可以包含空值,那麼查詢將會中斷。

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

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




sql