Oracle-11g-R2

如何避免特定條件下的重複記錄

  • July 6, 2015

標題##我有一個表格,其中包含如下數據

+----+--------+-----------+----------------+
| id |  name  | testfield |     status     |
+----+--------+-----------+----------------+
|  1 | raju   |        11 |         import |
|  1 | raju   |        11 |         ticket |
|  2 | ravi   |        22 |         import |
|  2 | ravi   |        33 |         ticket |
|  3 | ramesh |        44 |         import |
|  3 | ramesh |        44 |         ticket |
|  4 | rahul  |        55 |         import |
|  5 | rudra  |        66 |         import |
+----+--------+-----------+----------------+

現在我想要如下輸出

+----+--------+-----------+----------------+
| id |  name  | testfield |     status     |
+----+--------+-----------+----------------+
|  1 | raju   |        11 |         ticket |
|  2 | ravi   |        33 |         ticket |
|  3 | ramesh |        44 |         ticket |
|  4 | rahul  |        55 |         import |
|  5 | rudra  |        66 |         import |
+----+--------+-----------+----------------+

解釋:如果我有一行(id,name)對的狀態“票”,應該選擇這一行。如果我有一行狀態為“導入”的(id,name)對,但沒有狀態為“ticket”的行,則應選擇該行。

例如,行 id 1,2 和 3 的狀態為“ticket”,因此應該顯示它們。id 為 4 和 5 的行沒有對應的“ticket”行(具有相同的 (id,name) 值),因此應該顯示“import”。

基於集合操作的可能解決方案。據我了解,您必須在狀態欄位中顯示所有包含“票證”的行,並在狀態欄位中顯示所有帶有“導入”的行,而在狀態欄位中沒有類似的帶有“票證”的行。

選擇 ID、名稱、測試欄位、狀態 
來自我的表
其中狀態='票'
聯盟
選擇 ID、名稱、測試欄位、狀態
從 mytable 哪裡
(id,name) 在
((選擇ID,名稱
來自我的表
其中狀態='導入'
)
減
(選擇身份證,姓名
來自我的表
其中狀態='票'
)) ;

但是sqlfiddle不喜歡它。它說

哎呀!有些不對勁。再試一次

$$ … $$

引用自:https://dba.stackexchange.com/questions/106056