2010-12-15 83 views
0

Compte tenu de la structure simple de base de données:SQL Server, sélectionnez l'élément aléatoire de la table où id utilisé dans une autre table

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) 

Est-ce que quelqu'un sait comment je peux écrire une instruction SQL pour faire ce qui suit?

Compte tenu du fait que je ne connais que int, Account.Id quelqu'un permet de dire @AccountId = 1. Sélectionnez un enregistrement aléatoire racine qui n'a pas enregistrements RootItem attachés qui ont un AccountId qui = @AccountID et où Root.Private = 0.

Ceci est pour SQL Server, toute aide serait appréciée, je ne suis pas très bon avec les jointures SQL.

Répondre

2
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() 

Pour éliminer des racines qui ont RootItems qui correspondent à l'ID de compte, nous ne la gauche joignons ci-dessus, mais dans la clause where, nous nous assurons (ri.Id est nul) qu'aucune correspondance a effectivement eu lieu. Pour sélectionner une ligne de manière aléatoire, nous passons commande avec newid(), qui générera un nouveau GUID pour chaque ligne, puis sélectionnera simplement le top 1.

Si nous avons besoin d'une source d'aléa plus forte, ou de bonnes statistiques propriétés, nous pouvons avoir à regarder travailler dans CLR.

+0

Très agréable, une utilisation parfaite pour 'NEWID()'. +1 – RPM1984

+0

Fantastique, merci. Absolument sur! – zeolows