SQL Server, выбирая случайный элемент из таблицы, где идентификатор используется в другой таблице - PullRequest
0 голосов
/ 15 декабря 2010

Учитывая простую структуру базы данных:

Account
   - Id (Primary Key)

Root
   - Id (Primary Key)
   - AccountId (FK to Account)
   - Private (bit)

RootItem
   - Id (Primary Key)
   - AccountId (FK to Account)
   - RootId (FK to Root)

Кто-нибудь знает, как я могу написать оператор SQL для выполнения следующих действий?

Учитывая тот факт, что я знаю только чей-то аккаунт. Идентифицируется как int, скажем, @AccountId = 1. Выберите случайную корневую запись, к которой нет прикрепленных записей RootItem, которые имеют AccountId = @AccountID и где Root.Private = 0.

Это для SQL Server, любая помощь была бы признательна, я не так хорош в объединениях SQL.

1 Ответ

2 голосов
/ 15 декабря 2010
select top 1 *
from
    Root r
        left join
    RootItem ri
        on
            r.Id = ri.RootID and
            ri.AccountId = @AccountID
where
    r.Private = 0 and
    ri.Id is null
order by
    newid()

Чтобы устранить корни, у которых есть RootItems, которые соответствуют идентификатору учетной записи, мы выполняем левое объединение выше, но затем в предложении where мы гарантируем (ri.Id равен нулю), что на самом деле совпадение не произошло.Чтобы выбрать строку случайным образом, мы упорядочиваем по newid (), которая сгенерирует новый GUID для каждой строки, а затем просто выбираем верхнюю 1.

Если нам нужен более сильный источник случайности или какой-тохорошие статистические свойства, нам, возможно, придется взглянуть на работу в CLR.

...