簡體   English   中英

MySQL:如何基於列刪除多行記錄的一行

[英]MySQL: How to Remove One Row of a Multi-Row Record Based on Column

如果我有兩個表,我正在加入,我寫的最簡單的查詢可能是這樣的:

SELECT *
FROM t1
LEFT JOIN t2 ON t1.id = t2.id

有一些記錄每個ID有多行,因為它們有多個雇主,所以t1看起來像這樣:

ID         Name         Employer
12345      Jerry        Comedy Cellar
12345      Jerry        NBC
12348      Elaine       Pendant Publishing
12346      George       Real Estate
12346      George       Yankees
12346      George       NBC
12347      Kramer       Kramerica Industries

t2與相似的ID相關聯,但有一些我想看的活動 - 因此上面的SELECT * 雖然如果Employer專欄是“NBC”,我不想要多行返回 - 但其他一切都很好。

唯一重要的另一件事是t2小於t1 ,因為t1是每個人而t2只來自進行特定活動的人 - 所以有些匹配不會從t2返回任何東西,但我仍然會喜歡它們返回,因此LEFT JOIN

如果我寫這樣的查詢:

SELECT *
FROM t1
LEFT JOIN t2 ON t1.id = t2.id
WHERE Employer <> "NBC"

然后它完全刪除了Jerry和George - 當我真正想要的只是NBC行不被返回,而是返回與它們相關聯的任何其他行。

如何在使用t2加入t1時寫入查詢以返回除NBC之外的每一行? 理想的輸出是來自t1所有行,無論它們是否與t2所有行匹配,除了在返回文件中刪除所有以“NBC”作為雇主的行。 基本上這里的理想是返回它們適合的JOIN,但無論如何將“NBC”作為雇主移除整行而不刪除其他行。

我寫的越多,似乎我應該在我的JOIN之前運行一個查詢來刪除t1中以“NBC”為雇主的所有行,然后運行普通查詢。

基本子集過濾

您可以通過擴展ON子句來過濾兩個合並(已連接)子集中的任何一個。

SELECT    *
FROM      t1
LEFT JOIN t2
       ON t1.ID = t2.ID
      AND t2.Employer != 'NBC'

如果您現在獲得null值,並且您不想要它們,則需要添加:

WHERE t2.Employer IS NOT NULL

擴展邏輯:

SELECT    *
FROM      t1
LEFT JOIN t2
       ON (t1.ID = t2.ID AND t2.Employer != 'NBC')
       OR (t2.ID = t2.ID AND t2.Employer IS NULL)

使用UNION

基本上, JOIN用於水平鏈接, UNION用於垂直鏈接數據集。

它合並到結果集:第一個沒有NBC,第二個(基本上是一個OUTER JOIN ),在t1中添加了不屬於t2的每個人。

SELECT    *
FROM      t1
LEFT JOIN t2
       ON t1.ID = t2.ID
      AND t2.Employer != 'NBC'
UNION
SELECT    *
FROM      t1
LEFT JOIN t2
       ON t1.ID = t2.ID
      AND t2.Employer IS NULL

結果集中的字符串操作

如果您只想刪除NBC作為字符串,這是一個解決方法:

SELECT
    t1.*,
    IF (t2.Employer = 'NBC', NULL, t2.Employer) AS Employer
FROM t1
LEFT JOIN t2
    ON t1.id = t2.id

這基本上用NULL替換"NBC"

暫無
暫無

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

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