0

Oracle11g

我想知道一个球员是否曾经玩过游击手。但是,一个玩家甚至可能不在我的桌子上,但我仍然想为该玩家返回一行。在这种情况下,玩家 #3 不在桌子上,但我还是想返回一行。

选择标准

如果玩家至少有一个 SHORTSTOP 记录,则只返回 1 行 YES。

如果玩家至少有一个记录并且没有一个是 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
4

2 回答 2

1

与其使用 where 子句,不如创建一个临时表,在您创建的表中插入值并左连接。

对 IF NULL 然后 NO 使用 case 语句,否则为 YES。

于 2013-04-11T20:52:14.343 回答
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
于 2013-04-11T20:56:55.917 回答