Зациклить все строки в таблице PL / SQL, а затем считать - PullRequest
0 голосов
/ 27 октября 2019

Я пытаюсь зациклить все строки в таблице и посчитать появления каждого элемента в таблице.

Мне нужно найти активного игрока (Active = Y) в таблице PLAYER, который имеет многодрузья. Я пробовал некоторые методы для цикла в таблице, но у меня ничего не получилось.

CREATE TABLE PLAYER(   
    NO_PLAYER INTEGER           
    Active  CHAR(1) -- Y is yes and N is no
);


CREATE TABLE FRIEND(
    NO_PLAYER_Inviter INTEGER  -- player who invite the others              
    NO_PLAYER_Invited INTEGER  -- player who is invited         
);

Предположим, в таблице PLAYER есть игроки 1 2 3 являются активными, игрок 4 неактивен, тогда у меня есть эти записи в таблицеДРУГ

ПРИМЕЧАНИЕ : мы принимаем дубликат

which means
1 2
2 1
2 3
then we say that 2 has 3 friends.
table FRIEND:
1    2
1    3
1    4  -- we will not consider 4 is a friend of 1 as 4 is inactive
2    1
2    4  -- we will not consider 4 is a friend of 2 as 4 is inactive
3    1
4    3  -- we will not consider 4 is a friend of 3 as 4 is inactive
I expect the result is 
player 1 has 4 friends
player 2 has 2 friends
player 3 has 2 friends
player 4 has 0 friends 

and the code return player 1

Ответы [ 2 ]

0 голосов
/ 27 октября 2019

Вы можете сделать это, используя union следующим образом:

select 
    'Player ' || p.no_player
    || ' has ' || count(1) 
    || ' friends' as res
from (select no_player_inviter as no_player from friend
    union all select no_player_invited from friend) f 
join player p on (p.no_player = f.no_player)
Where p.active = 'Y'
group by p.no_player;

Также вы можете использовать inner join следующим образом:

select 'Player ' || p.no_player
        || ' has ' || count(1) 
        || ' friends' as res
from player p
join friends f
on (p.no_player in (f.no_player_inviter, f.no_player_invited))
where p.p.active = 'Y'
group by p.no_player;

Cheers !!

0 голосов
/ 27 октября 2019

Если, как предполагает ожидаемый результат, вас не заботят дубликаты, вы можете использовать union all и агрегирование:

select 
    player,
    count(*) no_of_friends
from (
    select no_player_inviter player from friend
    union all select no_player_invited from friend
) t
group by player
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...