Как сделать, подзапрос Postgresql в избранном пункте с присоединяется из пункта как SQL Server?

Я пытаюсь записать следующий запрос на postgresql:

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: "подзапрос в ОТ не может относиться до других отношений того же уровня запроса". Таким образом, я застреваю. Кто-либо знает, как я могу достигнуть этого?

Спасибо

70
задан John Topley 1 December 2015 в 13:33
поделиться

2 ответа

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

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, а также по name и author_id, что, как мне кажется, было нежелательно. Однако я не уверен, как это можно обойти, поскольку вам нужно иметь id, чтобы присоединиться ко второму подзапросу. Возможно, кто-то другой предложит лучшее решение.

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

103
ответ дан 24 November 2019 в 13:25
поделиться

Я просто отвечаю здесь с форматированной версией окончательного 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)
12
ответ дан 24 November 2019 в 13:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: