2013-04-11 42 views
0

Oracle11g如何爲'where value in'子句中的每個項目返回記錄?

我想知道玩家是否曾經玩過游擊手。然而,玩家 甚至可能不在我的桌子上,但我仍然想爲該玩家返回一排。在這種情況下,玩家#3不在桌子上,但我想返回一排。

選擇標準

如果玩家擁有至少一個游擊手記錄然後返回YES只有1行。

如果玩家至少有一條記錄,並且沒有一條是SHORTSTOP,那麼只返回一行NO。

如果玩家沒有記錄,那麼只返回一行NO。

查詢

with baseball_players as 
(select 1 as player_id, 'SHORTSTOP' as position from dual union all 
select 1 as player_id, 'FIRSTBASE' as position from dual union all 
select 2 as player_id, 'FIRSTBASE' as position from dual)             
select player_id, case position 
    when 'SHORTSTOP' then 'YES' 
    else 'NO' 
    end has_played 
from baseball_players 
where player_id in (1,2,3) 

問:我如何寫查詢來獲取想要的結果嗎?

所需的輸出

PLAYER_ID HAS_PLAYED 
---------------------- 
    1  YES 
    2  NO 
    3  NO 
+0

什麼是你的問題? – 2013-04-11 20:50:04

+0

我剛剛向OP添加了問題.. – zundarz 2013-04-11 20:52:16

+0

你打算如何將'player_id'傳遞給查詢?你可以請你發佈**你的**表的結構嗎? – 2013-04-11 20:56:57

回答

1

如何:

WITH playerList AS 
    (
     SELECT 
      1 player_id 
     FROM 
      dual 
     UNION 
     SELECT 
      2 
     FROM 
      dual 
     UNION 
     SELECT 
      3 
     FROM 
      dual 
    ) 
, baseball_players as 
    (
     select 1 as player_id, 'SHORTSTOP' as position from dual union all 
     select 1 as player_id, 'FIRSTBASE' as position from dual union all 
     select 2 as player_id, 'FIRSTBASE' as position from dual 
    ) 
SELECT 
    pl.player_id 
    , MAX(CASE WHEN bp.position = 'SHORTSTOP' THEN 'YES' ELSE 'NO' END) 
FROM 
    playerList pl 
LEFT JOIN 
    baseball_players bp 
    ON 
    bp.player_id = pl.player_id 
GROUP BY 
    pl.player_id 
1

而不是使用WHERE子句,創建一個tempoary表中插入值和左的連接上創建的表。

對IF NULL使用case語句,然後是NO,否則使用YES。

相關問題