2017-09-25 72 views
0

好的,我相信我在正確的軌道上,但有一些難以取得預期的結果。我試圖檢查表中的特定標誌的兩個不同列,然後將所述標誌與第二列相關聯。選擇不同列上的多個條件

例如,我所說表:

ID date  flag  flag_id 
----------------------------------- 
1 09/25/2017 NO  0001 
2 09/25/2017 OTHER  0002 
3 09/25/2017 NO  0002 
4 09/25/2017 OTHER  0003 
5 09/25/2017 OTHER  0004 
6 09/25/2017 NO  0005 
7 09/25/2017 OTHER2 0005 
8 09/25/2017 OTHER  0006 

什麼是需要被輸出的是包含重複flag_id的,並在其標記欄含有NO唯一的,但不包括NO線本身(線所以只有數據行不顯示NO)。因此,在這種情況下,只有輸出線2和7。我已經寫的東西,應該是這樣的:

SELECT distinct 
    t1.ID, 
    t1.date, 
    t1.flag, 
    t1.flag_id, 
FROM table1 t1 
WHERE (SELECT COUNT(*) 
    FROM table1 t2 
    WHERE t1.flag_id = t2.flag_id 
    AND t1.flag != 'NO' 
    AND t2.flag = 'NO')>1 

這裏製作一個初學者的錯誤,而你我心中還是很新的這一點,所以在解釋爲什麼這不起作用或爲什麼其他作品將不勝感激。

+0

我不知道它是如何,甚至可能讓你獲得一個不同的ID爲結果那裏,除非你正在運行一個不同的查詢或我誤解你的問題。 – ZLK

+0

重新格式化和刪除的例子,這應該更有意義,因爲我只是想獲得上面列出的結果。 :) – maaier

回答

1

您可以使用EXISTS來代替:

SQL Fiddle

MS SQL服務器2014架構設置

SELECT 
    t1.ID, 
    t1.date, 
    t1.flag, 
    t1.flag_id 
FROM table1 t1 
WHERE exists (SELECT 1 
     FROM table1 t2 
    WHERE t1.flag_id = t2.flag_id 
    AND t1.flag != 'NO' 
    AND t2.flag = 'NO') 

當你有多個不同的標誌,也適用此

CREATE TABLE Table1 
    ([ID] int, [date] datetime, [flag] varchar(10), [flag_id] int) 
; 

INSERT INTO Table1 
    ([ID], [date], [flag], [flag_id]) 
VALUES 
    (1, '2017-09-25 10:00:00', 'NO', 0001), 
    (2, '2017-09-25 10:00:00', 'OTHER', 0002), 
    (3, '2017-09-25 10:00:00', 'NO', 0002), 
    (4, '2017-09-25 10:00:00', 'OTHER', 0003), 
    (5, '2017-09-25 10:00:00', 'OTHER', 0004), 
    (6, '2017-09-25 10:00:00', 'NO', 0005), 
    (7, '2017-09-25 10:00:00', 'OTHER', 0005), 
    (8, '2017-09-25 10:00:00', 'OTHER2', 0005), 
    (9, '2017-09-25 10:00:00', 'OTHER', 0006) 
; 

查詢1

SELECT 
    t1.ID, 
    t1.date, 
    t1.flag, 
    t1.flag_id 
FROM table1 t1 
WHERE exists (SELECT 1 
     FROM table1 t2 
    WHERE t1.flag_id = t2.flag_id 
    AND t1.flag != 'NO' 
    AND t2.flag = 'NO') 

Results

| ID |     date | flag | flag_id | 
|----|----------------------|--------|---------| 
| 2 | 2017-09-25T10:00:00Z | OTHER |  2 | 
| 7 | 2017-09-25T10:00:00Z | OTHER |  5 | 
| 8 | 2017-09-25T10:00:00Z | OTHER2 |  5 | 
+0

是的,這是一個有效的方法來做到這一點。 – LAS

0

您的輸出對查詢沒有意義。這將返回標誌不是No的所有行,但是標誌爲No.的另一行請注意,如果這是查詢停止的位置,則使用exists會更有效。如果你想擴展查詢,這可能會更好。

SELECT distinct 
    t_other.ID, 
    t_other.date, 
    t_other.flag, 
    t_other.flag_id, 
FROM table1 t_no 
    inner join table1 t_other on t_no.flag_id = t_other.flag_id 
WHERE t_no.flag = 'NO' and t_other.flag <> 'NO' 
+0

我喜歡這個答案,現在我有一個更有趣的情況。假設數據集包含3個不同的標誌('NO,OTHER,OTHER2'),並且我想輸出所有具有重複'flag_id'的行,但是排除具有「NO」的行,那麼這個怎麼辦呢?同樣假設標誌的數量可以達到100,並且不準確地指定每個「標誌」。 – maaier

+0

@maaier我建議嘗試這兩種解決方案。我期望他們返回相同的答案,但是cha的答案會更有效率地運行,因爲您希望消除結果集中的No。 – LAS