2010-06-09 1 views
43

Я пытаюсь написать следующий запрос на PostgreSQL:Как выполнить подзапрос Postgresql в предложении select с вступлением из предложения типа SQL Server?

select name, author_id, count(1), 
    (select count(1) 
    from names as n2 
    where n2.id = n1.id 
     and t2.author_id = t1.author_id 
    )    
from names as n1 
group by name, author_id 

Это, конечно, работать на Microsoft SQL Server, но это вовсе не на postegresql. Я прочитал документацию немного, и, кажется, я мог бы переписать как:

select name, author_id, count(1), total      
from names as n1, (select count(1) as total 
    from names as n2 
    where n2.id = n1.id 
     and n2.author_id = t1.author_id 
    ) as total 
group by name, author_id 

Но что возвращает следующую ошибку postegresql: «подзапрос в FROM не может ссылаться на другие отношения того же уровня запросов». Поэтому я застрял. Кто-нибудь знает, как я могу это достичь?

Благодаря

+0

На самом деле, кажется, что это должно работать на Postgres (возможно 6 лет назад это не было :)) – qwertzguy

ответ

69

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

select n1.name, n1.author_id, count_1, total_count 
    from (select id, name, author_id, count(1) as count_1 
      from names 
      group by id, name, author_id) n1 
inner join (select id, author_id, count(1) as total_count 
       from names 
       group by id, author_id) n2 
    on (n2.id = n1.id and n2.author_id = n1.author_id) 

К сожалению, это добавляет требование группировки первого подзапроса по id, а также имя и author_id, которые, как я думаю, не были нужны. Я не уверен, как обойти это, тем не менее, поскольку вам нужно иметь идентификатор, доступный для присоединения во втором подзапросе. Возможно, кто-то еще придумает лучшее решение.

Делитесь и наслаждайтесь.

+0

Идеальный Боб, это действительно сработало. Большое спасибо! Я должен был внести небольшое изменение, потому что мне не нужно соединение с id, просто author_id. Таким образом, окончательный запрос: выберите n1.name, n1.author_id, счетчик_1, TOTAL_COUNT из (выберите идентификатор, название, AUTHOR_ID, граф (1), как COUNT_1 из имен группы по ид, имя, author_id) n1 внутреннее соединение (выберите author_id, граф (1), как TOTAL_COUNT из имен группы по author_id) n2 на (n2.author_id = n1.author_id) Теперь, когда у меня есть это, что я действительно хочу, чтобы разделить счетчик_1 на TOTAL_COUNT иметь нормализованную частоту. = D –

+0

ops, только что понял, что sql не правильно отформатирован здесь. :( Дает ответ на дополнение. –

+0

У меня не было проблемы, когда Рикадо говорил «бой, но этот SQL полностью исправил мои проблемы ...: D СПАСИБО !!!» – tftd

7

Я просто ответив здесь с отформатированной версией окончательного SQL я нуждался на основе Боб Джарвис ответ, как отвечал на мой комментарий выше:

select n1.name, n1.author_id, cast(count_1 as numeric)/total_count 
    from (select id, name, author_id, count(1) as count_1 
      from names 
      group by id, name, author_id) n1 
inner join (select author_id, count(1) as total_count 
       from names 
       group by author_id) n2 
    on (n2.author_id = n1.author_id)