SP: получить 5 случайных записей плюс 1 - PullRequest
2 голосов
/ 21 июля 2009

Мне нужно получить 5 случайных записей из таблицы плюс еще одну запись, основанную на данных из пользовательских настроек, сохраненных во второй таблице.

Вот два заявления, которые я создал до сих пор:

Получает любимую благотворительность на основе ключа, установленного в TBL_MEMBERS:

ВЫБЕРИТЕ DISTINCT TBL_CHARITIES. * ИЗ TBL_CHARITIES Присоединяйтесь к TBL_MEMBERS ON TBL_CHARITIES.cha_Key = TBL_MEMBERS.members_Favourite ГДЕ TBL_MEMBERS.members_Id = 16

Получает 5 случайных благотворительных организаций:

ВЫБРАТЬ ТОП 5 * ОТ TBL_CHARITIES ГДЕ cha_Active = 'TRUE' И cha_Key! = '1' ЗАКАЗАТЬ NEWID ();

При использовании в хранимой процедуре она возвращает только первый оператор SELECT на мою страницу .Net. Как я могу объединить два утверждения, не допуская повторения результатов (например, избранное не присутствует в 5 случайных записях?

Большое спасибо!


Ok! Так что теперь я обновил вещи и получил следующее:

CREATE PROCEDURE web.getRandomCharities ( @tmp_ID bigint --members ID ) AS BEGIN

WITH    q AS
 (
 SELECT  TOP 5 *
 FROM    TBL_CHARITIES
 WHERE   cha_Active = 'TRUE'
         AND cha_Key != '1'
 ORDER BY NEWID()
 )

SELECT * FROM q 
 UNION ALL 
 SELECT TOP 1 * FROM ( 
         SELECT * FROM TBL_CHARITIES WHERE TBL_CHARITIES.cha_Key IN 
         ( SELECT members_Favourite FROM TBL_MEMBERS WHERE members_Id = @tmp_ID )        EXCEPT SELECT * FROM q ) tc

END

Теперь мне нужно иметь возможность записывать "cha_Key == '1'", но только если это не фаворит пользователя. Это возможно?

Спасибо за все, пока. Это действительно ценится.

Ответы [ 4 ]

1 голос
/ 21 июля 2009

Всего UNION ALL их:

 WITH    q AS
         (
         SELECT  TOP 5 *
         FROM    TBL_CHARITIES
         WHERE   cha_Active = 'TRUE'
                 AND cha_Key != '1'
         ORDER BY NEWID()
         )
 SELECT  *
 FROM    q
 UNION ALL
 SELECT  TOP 1 *
 FROM    (
         SELECT  *
         FROM    TBL_CHARITIES
         WHERE   TBL_CHARITIES.cha_Key IN
                 (
                 SELECT  members_Favourite
                 FROM    TBL_MEMBERS
                 WHERE   members_Id = 16
                 )
         EXCEPT
         SELECT  *
         FROM    q
         ) tc

Обновление:

К сожалению, приведенный выше запрос не будет работать должным образом, поскольку CTE переоценены в SQL Server, а второй экземпляр q даст другие записи.

См. Этот пост в моем блоге для более подробной информации:

Вам нужно переписать запрос следующим образом:

 WITH    q AS
         (
         SELECT  TOP 5 *
         FROM    TBL_CHARITIES
         WHERE   cha_Active = 'TRUE'
                 AND cha_Key != '1'
         ORDER BY
                 NEWID()
         ),
         r AS
         (
         SELECT  *
         FROM    TBL_CHARITIES
         WHERE   TBL_CHARITIES.cha_Key IN
                 (
                 SELECT  members_Favourite
                 FROM    TBL_MEMBERS
                 WHERE   members_Id = 16
                 )
         )
 SELECT  TOP 6 *
 FROM    q
 FULL OUTER JOIN
         r
 JOIN    TBL_CHARITIES t
 ON      t.id = COALESCE(q.id, r.id)
 ORDER BY
         q.id

, при условии, что id является PRIMARY KEY из TBL_CHARITIES.

0 голосов
/ 21 июля 2009

Создание хранимой процедуры с параметром @ Memeber_ID.

Затем выполните код, который сказал Кассной, с некоторыми изменениями.

Итак, вытащите 5 верхних записей, но добавьте объединение в TBL_MEMBERS, и предложение where, что полученные записи не может быть выбором memeber_ID. Затем сделайте СОЮЗ для выбора этих членов.

0 голосов
/ 21 июля 2009

попробуйте

 SELECT  *
 FROM    (
         SELECT  TOP 5 *
         FROM    TBL_CHARITIES
         WHERE   cha_Active = 'TRUE'
                 AND cha_Key != '1'
         AND cha_Key not in(SELECT  TBL_MEMBERS.members_Favourite
            WHERE   TBL_MEMBERS.members_Id = 16)
         ORDER BY NEWID()
         ) q
 UNION ALL
 SELECT  TOP 1 TBL_CHARITIES.*
 FROM    TBL_CHARITIES
 WHERE   TBL_CHARITIES.cha_Key IN
         (
         SELECT  TBL_MEMBERS.members_Favourite
         FROM    TBL_MEMBERS
         WHERE   TBL_MEMBERS.members_Id = 16
         )
0 голосов
/ 21 июля 2009

Я бы предложил вывести список идентификаторов на свою страницу .Net и использовать свой фоновый код, чтобы случайным образом выбрать N номеров идентификаторов и передать их в качестве параметра в свой запрос. Вы можете исключить избранное пользователя, используя where id != BL_MEMBERS.members_Favourite в запросе, который извлекает существующие идентификаторы.

Это позволяет вам довольно легко увеличивать / уменьшать количество случайно выбранных элементов и перемещает случайную генерацию и проверяет уникальные элементы в .Net, где это выполняется гораздо проще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...