2013-12-26 3 views
0

У меня есть запрос:запроса ведет себя не как ожидалось

select count(*) as total 
from sheet_record right join 
    (select * from sheet_record limit 10) as sr 
    on 1=1; 

Если я понял правильно (что я думаю, что я не сделал), по правому краю, предполагают, чтобы вернуть все строки из правой таблицы в сочетании с левой таблицей. он должен быть в строке списка 10. Но запрос возвращает только 1 строку с 1 столбец 'total'. И неважно, останется ли полное внутреннее соединение, это будет всегда результат.

Если я меняю таблицы и использую левое соединение с небольшой модификацией запроса, то он работает правильно (модификации не имеют значения, потому что в этом случае я получаю именно то, что ожидаю получить). Но мне интересно узнать, что я действительно не понял о соединении, и почему этот запрос работает не так, как ожидалось.

+0

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

+0

Пример: получить 10 записей из таблицы X (идентификатор , имя, возраст). Типичный результат включает дополнительный столбец «total_rows» (который представляет собой общее количество строк в таблице X). Важное замечание: как сделать это с правильным присоединением? – simar

ответ

1

Вы возвращаете один столбец, потому что select содержит функцию агрегации, превращая это в запрос агрегации. Запрос должен возвращать в 10 раз больше количества строк в таблице sheet_record.

Ваш запрос представляет собой эффективное соединение. Итак, если вы сделали:

select * 
from sheet_record right join 
    (select * from sheet_record limit 10) as sr 
    on 1=1; 

Вы получите 10 строк для каждой записи в sheet_record. Каждая из этих записей будет иметь дополнительные столбцы из одной из десяти записей из одной таблицы.

+0

Я думал, что правое соединение вернет не меньше строк, а затем в правый стол. – simar

+0

@simar. , , Соединение делает то, что вы ожидаете.* После этого * запрос выполняет агрегацию. Соединение указывает, какие строки использовать для агрегации. –

0

Вы используете функцию count(*), без каких-либо группировок. Это в значительной степени приведет к возврату одной строки назад. Попробуйте выполнить запрос без count(), чтобы узнать, приближаетесь ли вы к тому, что вы ожидаете.

+0

выглядит, как будто я совсем не понимаю, как правильно присоединиться. я пытаюсь получить 10 строк из таблицы sheet_record с дополнительным столбцом, в котором определены общие записи в таблице sheet_record. Я попытался запустить без учета и, как ожидалось, 21000 записей для умножения, и во всех случаях условие истинно (будет длиться долго, а не то, что ожидалось) – simar

+0

Возможно, вам понадобится использовать внешний ключ для присоединения. Без присоединения к определенным столбцам каждый столбец будет сопоставляться друг с другом столбцом из другой таблицы. [Правый пример присоединения] (http://www.w3schools.com/sql/sql_join_right.asp) Вы можете заметить использование «ON» в примерах. Если вы укажете имена столбцов этих двух таблиц, мы можем помочь вам с запросом. – Will

+0

Не имеет значения имен столбцов. Запрос вот-вот получит лимит количества строк из любой таблицы с дополнительным столбцом с общим количеством строк в этой таблице. Это обычная проблема, чтобы показать таблицу в ui с возможностью пейджинга. Я нашел запрос, который может это сделать, с левым соединением. Я просто тестировал запрос с тем же результатом, используя правое соединение. – simar

0

В конце концов с помощью комментаторов я понял, что случилось. На самом деле это не так, но я точно не поймал.

// this code below is work fine. query will return page 15 with 10 records in. 

select *from sheet_record inner join (select count(*) as total from sheet_record) as sr on 1=1 limit 10 offset 140; 

Я думал, что соединение берет таблицу слева и соединяется с правой таблицей. Но в тот момент, когда я работал над скриптом (выше), я имел на правой стороне представление (таблица, построенное подзапросом) вместо чистой таблицы, и я думал, что левая сторона также представляет собой представление, сделанное (выберите * from sheet_record), которое ошибка.

Идея состоит в том, чтобы получить набор записей из таблицы X с дополнительным столбцом, имеющим значение общего количества записей в таблице. (Это обычная проблема, когда есть потребность показать таблицу в пользовательском интерфейсе, используя пейджинг. Чтобы узнать, сколько страниц должно быть доступно, мне нужно знать, сколько записей в целом, поэтому я могу рассчитать, сколько страниц доступно)

Я думаю, что это должно быть что-то

select * from (
    (here is some subquery which will give a view using count(*) function on some table X and it will be used as left table) 
    right join 
    (here is some subquery which will get some set or records from table X with limit and offset) 
    on 1=1 //becouse i need all row from right table(view) in all cases it should be true 
) 

запрос с правом присоединиться будет немного сложнее. Я использую postgres.

Так в конце концов мне удалось получить результат с правом присоединиться

select * from (select count(*) as total from sheet_record) as srt right join (select * from sheet_record limit 10 offset 140) as sr on 1=1; 
Смежные вопросы