2016-07-02 55 views
0
Filename||status 
--------------- 
A|10 
A|22 
B|10 

我的預期輸出是如何在同一個表比較值

B|10 

我不應該得到的文件名是兩個10和22的狀態

+0

請說明您的問題,並添加您使用至今讓你的輸出 – Carlo

+0

我現在查詢查詢是SELECT * FROM表,其中狀態= 10; –

+0

我得到2行A || 10和B || 10但我不應得到狀態爲10和22的文件名 –

回答

2

輸出讓我們嘗試重申你的問題 - 您正在尋找具有10狀態,但不具備的22狀態一旦問題是措辭這樣的文件,我們可以很容易地轉換使用exists操作到SQL要求:

SELECT * 
FROM mytable a 
WHERE status = 10 AND 
     NOT EXISTS (SELECT * 
        FROM mytable b 
        WHERE a.filename = b.filename AND 
          b.status = 22) 
+0

的OP說'我不應該得到的文件名是兩個10和22 status'這只是檢查其是否具有狀態'10',而不是狀態'輸出22'但不檢查相反情況。 – MT0

+0

嗨Mureinik。 。感謝您的建議。 Ur查詢工作。非常感謝 –

0

這裏有一個查詢得到的結果:

WITH files AS(
    SELECT 'A' AS filename, 10 AS status FROM dual UNION ALL 
    SELECT 'A' AS filename, 22 AS status FROM dual UNION ALL 
    SELECT 'B' AS filename, 10 AS status FROM dual UNION ALL 
    SELECT 'C' AS filename, 22 AS status FROM dual 
) 
    SELECT filename, status 
    FROM files 
    WHERE filename NOT IN (
     SELECT f1.filename 
     FROM files f1, files f2 
     WHERE f1.filename = f2.filename 
      AND f1.status = 22 
      AND f2.status = 10 
    ); 

我在表中增加一個C記錄檢查結果的正確性:

B 10          
C 22          
+0

OP聲明'我不應該得到文件名爲10和22狀態的輸出「,這隻會檢查它是否具有狀態'10'而不是狀態'22',但不檢查反向。 – MT0

+0

我改正了答案 – Carlo

0

我不應該得到輸出,其文件名是10和22狀態

換句話說,你可以有狀態10,並且沒有狀態爲22的行,或者可以使用狀態22,並且沒有狀態爲10的行。

無論這些查詢的需要自連接(它們都只能使用一個表掃描):

查詢

SELECT filename 
FROM table_name 
GROUP BY filename 
HAVING ( COUNT(CASE status WHEN 10 THEN 1 END) > 0 
     AND COUNT(CASE status WHEN 22 THEN 1 END) = 0) 
OR  ( COUNT(CASE status WHEN 10 THEN 1 END) = 0 
     AND COUNT(CASE status WHEN 22 THEN 1 END) > 0); 

輸出

FILENAME 
-------- 
B 

查詢

SELECT filename, 
     status 
FROM (
    SELECT t.*, 
     COUNT(CASE status WHEN 10 THEN 1 END) 
      OVER (PARTITION BY filename) AS s10, 
     COUNT(CASE status WHEN 22 THEN 1 END) 
      OVER (PARTITION BY filename) AS s22 
    FROM table_name t 
    WHERE status IN (10, 22) 
) 
WHERE (s10 > 0 AND s22 = 0) 
OR  (s10 = 0 AND s22 > 0); 

輸出

FILENAME STATUS 
-------- ------ 
B   10 
-2
select Filename, min(status) 
    from [table_name] 
    group by Filename 
having count(*) = 1