簡體   English   中英

MySQL Join:如果一行滿足條件,則忽略所有重復行

[英]MySQL Join: Omit ALL repeating rows IF one row meets a condition

給定以下示例表

TABLE_A
-----
 ID  
-----
  1
  2
  3
  4
  5

TABLE_B
---------------------------
 TABLE_A_ID        DETAIL
---------------------------
    1               val_x
    2               val_x
    2               val_y
    4               val_y
    5               val_other

我在這兩個表上進行左聯接,並獲得以下輸出

-------------------------------
   TABLE_A_ID        DETAIL
-------------------------------
       1              val_x
       2              val_y
       2              val_x
       3              null
       4              val_y
       5              val_other

這是我從左聯接中所期望的。

我的問題是,我也想刪除具有行DETAIL = val_y並具有重復的所有行TABLE_A_ID如果組中的任何行有一個DETAIL = val_y

所以我需要的輸出是

-------------------------------
   TABLE_A_ID        DETAIL
-------------------------------
       1              val_x
       3              null
       5              val_other

我嘗試使用GROUP_BY TABLE_A_IDHAVING DETAIL != val_y但這似乎不起作用。 我認為出於明顯的原因,例如GROUP_BYHAVING用於聚合並消除小於或大於對的值?

有沒有辦法在MySQL中做到這一點,還是我要求太多?

注意:這些是示例表。 它們不反映生產系統,因此不希望在問題和示例范圍之外發表評論或回答-這只會使事情變得混亂。

SELECT sub1.id table_a_id, sub1.detail
FROM (
    SELECT a.id, detail
    FROM table_a a
    LEFT JOIN table_b b on a.id = b.table_a_id) sub1
LEFT JOIN (
    SELECT DISTINCT table_a_id
    FROM table_b
    WHERE detail = 'val_y') sub2 
ON sub1.id = sub2.table_a_id
WHERE sub2.table_a_id IS NULL

sub2子查詢查找滿足刪除條件的所有ID。 然后將其與原始查詢合並以過濾出這些ID。

演示

您可以使用另一個LEFT JOIN消除具有“ val_y”值的ID;

SELECT a.id as table_a_id, b1.detail 
FROM table_a a
LEFT JOIN table_b b1 ON a.id = b1.table_a_id
LEFT JOIN table_b b2 ON a.id = b2.table_a_id AND b2.detail = 'val_y'
WHERE b2.detail IS NULL

要測試的SQLfiddle (已更新新的示例數據)

嘗試這個:

   SELECT b.table_a_id, b.detail
   FROM table_a a JOIN table_b b ON a.id = b.id
   GROUP BY b.table_a_id
   HAVING COUNT( b.table_a_id ) == 1;

就像是

select * from table_b where table_a_id not in (
    select TABLE_A_ID from TABLE_B where detail = 'val_y'
)

我認為以下將對您有幫助

Select a.ID ,b.Detail
From Table1 a 
LEFT OUTER JOIN (SELECT id ,count(*) from Table2 group by id having count(*) =1 ) b
ON a.id = b.ID

暫無
暫無

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

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