2015-10-05 63 views
0

Table-1NominationPeriods沒有得到與內部查詢慾望SQL輸出

---------------------- 
Id Period Status  
---------------------- 
1 9  Unlocked     
3 8  locked 
---------------------- 

Table-2NominationRevisions

------------------------------------------- 
Id Revision Period Status 
------------------------------------------- 
15 1   9  M  
19 2   9  R  
20 3   9  A  
-------------------------------------------- 

Query

SELECT Period 
     ,nomper.STATUS 
     ,(
      CASE 
       WHEN (
         (
          SELECT (
            CASE 
             WHEN STATUS IN ('P','A') 
              THEN 'TRUE' 
             ELSE 'FALSE' 
             END 
            ) 
          FROM NominationRevisions 
          WHERE revision = (
            SELECT max(revision) 
            FROM NominationRevisions 
            WHERE Period = nomper.Period 
            ) 
           AND NomPeriodNbr = nomper.Period 
          ) = 'TRUE' 
         ) 
        THEN 'TRUE' 
       ELSE 'FALSE' 
       END 
      ) AS Flag 
    FROM NominationPeriods nomper 

Expected Output

------------------------------------- 
Period Status  Flag 
------------------------------------- 
9  Unlocked TRUE 
8  locked  TRUE 
------------------------------------- 

Actual Output

------------------------------------- 
Period Status  Flag 
------------------------------------- 
9  Unlocked TRUE 
------------------------------------- 

我想爲具有輸出所有NominationPeriods列表

  1. 時期的最高版本是 'A' 或 'P',然後標記= TRUE
  2. 如果沒有找到一段時間的修訂,那麼也返回標誌=真
+1

這是因爲你的子查詢在where子句中只返回一個結果。 –

+0

由於@SuchitKumar注意到子查詢生病期沒有返回期間8,因爲在第二個表中沒有該時期的行。嘗試使用連接重寫它,以便可以使用外部連接 – jean

+0

您正在使用哪些DBMS? Postgres的?甲骨文? –

回答

0

試試這個:

select "Period", "Status", 
     Coalesce((select top 1 case when r."Status" in ('A', 'P') then 'TRUE' else 'FALSE' end from NominationRevisions r where p.Period = r.Period order by r.Revision desc), 'TRUE') "Flag" 
from NominationPeriods p 

現在我相信沒關係。

0

我想到這可能爲你工作,使用JOIN

SELECT 
    np.*, 
    COALESCE(
     IF(nr.`Status` IS NULL, 'TRUE', NULL), 
     IF(nr.`Status` IN ('A', 'R'), 'TRUE', NULL), 
     'FALSE' 
    ) AS 'Flag' 
FROM nominationperiods np 
LEFT JOIN nominationrevisions nr ON 
    np.Period = nr.Period 
    AND nr.Revision = (SELECT MAX(nr.Revision) 
         FROM nominationrevisions nr 
         WHERE nr.Period = np.Period) 

的加入只需要max修訂,然後使用coalesce()測試所有條件true,用回退到false

0

我重寫了你的查詢,用較少的例子和一個didatic的方式。請參閱fiddle以獲取您提供的數據的工作示例。

的一點是:返回所有提名期,但只設置標誌TRUE如果最後修訂得到一個一個P狀態。

select nomper.Period, nomper.Status 
,case when 
    (
    exists 
    (
     select 1 
     from dbo.[NominationRevisions] nr 
     join 
     (
      select max(nr0.Revision) as MaxRevision, nr0.Period 
      from dbo.[NominationRevisions] nr0 
      group by nr0.Period 
     ) as nr1 on nr1.Period = nr.Period 
        and nr1.MaxRevision = nr.Revision 
     where nr.Status = 'A' or nr.Status = 'P' 
    ) 
) 
    then 'TRUE' 
    else 'FALSE' 
end 
from dbo.[NominationPeriods] nomper