2014-11-24 4 views
0

У меня есть таблицы, состоящие изподзапросов для каждого события в таблице

  1. гонки

-race_id

-athlete_id

-местной

2 . приз

-race_id

-местная

-Деньги

теперь мне нужно выполнить запрос для каждой гонки регистрирующей призовые деньги за первое, второе и третье место ?? Я знаю, как получить результаты для всех гонок для всех мест:

SELECT 
    * 
FROM 
    prize 
GROUP BY race_id , place; 

однако, мне нужно заголовки столбцов, которые будут отображаться в качестве такого

RACE_ID | ПЕРВЫЙ | ВТОРОЙ | THIRD

Я попытался запустить этот следующий SQL, однако, получить сообщение об ошибке «ErrorCode: 1242. Subquery возвращает более 1 строки» SELECT race_id, «First», «Second», Third 'FROM prize WHERE' First ' = (ВЫБРАТЬ ДЕНЬГИ ОТ ПРИЕМА WHERE место IN (1)) И ГДЕ «Второе» = (ВЫБЕРИТЕ ДЕНЬГИ ОТ ПРИЗЫРА ГДЕ МЕСТО В (2)) И ГДЕ «Третий» = (ВЫБЕРИТЕ ДЕНЬГИ от приза ГДЕ место В (3)) ЗАКАЗАТЬ BY race_id; Я понимаю, что подзапросы требуют, чтобы операторы были скалярными, поэтому означает ли это, что мне нужно будет запускать отдельные подзапросы для каждой расы?

+0

То, что вы пытаетесь сделать, часто называют «стержнем». –

+0

@jimmytiler, я не понял, почему и не принял ответ – radar

+0

извините радар. хотя ваш ответ действительно дает мне нужные результаты, мне нужно, чтобы он был в форме запроса. Я опубликовал другое сообщение в этом столбце с SQL, которого я пытаюсь достичь. Я так потерялся на этом? – jimmytiler

ответ

0

как насчет этого ??

SELECT a.race_id, 
     a.place, 
     b.athlete_id, 
     a.money 
FROM prize a join race b 
on a.place = b.place 
AND a.race_id = b.race_id; 
+0

Спасибо, Майкл. Мне нужно, чтобы он был вложен (подзапросы). – jimmytiler

1

Вам нужно сделать case based aggregation, в других СУБД, вы можете сделать это с pivot пункта.

SELECT 
    race_id, 
    max(case when place =1 then money else NULL end) as FIRST, 
    max(case when place =2 then money else NULL end) as SECOND, 
    max(case when place =3 then money else NULL end) as THIRD, 

FROM 
    prize 
GROUP BY 
    race_id 
0

Вы можете получить желаемый результат с использованием условной агрегации (как предлагает RADAR). Или вы можете сделать несколько соединений:

select r.*, p1.money as first, p2.money as second, p3.money as third 
from race r left join 
    prize p1 
    on p1.race_id = r.race_id and p1.place = 1 left join 
    prize p2 
    on p2.race_id = r.race_id and p2.place = 2 left join 
    prize p3 
    on p3.race_id = r.race_id and p3.place = 3; 
+0

Можно ли использовать несколько гнездящихся как таковых: SELECT , , column.имя> ОТ ГДЕ В \t (SELECT , \t ОТ \t ГДЕ = #); Из моих инструкций меня попросят «проверить» каждое утверждение, прежде чем объединять все это вместе, поэтому я предполагаю многократное вложение? – jimmytiler

+0

Я так считаю. Решение @ радара кажется простым. Я предложил это в качестве альтернативы. –

Смежные вопросы