2009-07-21 4 views
0

Grâce à l'aide de beaucoup d'entre vous, j'ai reçu le code suivant qui fonctionne très bien. Cependant ive réalisé ive manqué un peu d'information importante hors de la question et donc reposted ici (avec le code mis à jour) pour clarifier.SP: Enregistrements aléatoires, Enregistrement Fave, Enregistrement Plus Réputé, PAS de répétition

Le code suivant obtient 5 enregistrements aléatoires d'une table, plus un autre enregistrement unique basé sur les utilisateurs favoris identifiés dans une deuxième table:

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 

Cependant, j'ai réalisé aussi besoin d'inclure le dossier où "cha_Key == '1'" si ce n'est pas la même chose que l'enregistrement retourné dans la deuxième instruction SELECT dans le code ci-dessus.

Qu'est-ce qui est logique?

MERCI !!!

+0

Pourriez-vous s'il vous plaît fournir quelques exemples de données et un resultset que vous souhaitez obtenir? – Quassnoi

+0

Il est préférable que vous venez de modifier votre question originale avec plus de détails. http://meta.stackexchange.com/questions/7771/is-this-abuse-or-misunderstanding-of-the-way-things-work –

+0

Quassnoi, Ok donc ce que je veux faire, c'est tout comme ci-dessus, mais aussi obtenir l'enregistrement que weve éliminé dans la première déclaration (cha_Key! = '1' ) si ce n'est pas le favori des utilisateurs (comme le retour par la déclaration de l'union) Essentiellement je veux 5 enregistrements aléatoires uniques (mais pas enregistrer No1) , plus l'enregistrement favori des utilisateurs, plus l'enregistrement No1 si ce n'est pas le favori. L'enregistrement n ° 1 devrait toujours apparaître comme le 1er enregistrement. Espérons que cela explique mieux? – Munklefish

Répondre

1

Je ne suis pas tout à fait sûr que je vous comprends, mais je crois qu'il va quelque chose comme ça ...

Cinq enregistrements aléatoires sans # 1 un enregistrement spécifique utilisateur Record # 1 si c'est pas enregistrement spécifique de l'utilisateur.

Si oui, je crois que ce fait que:

 

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 
UNION ALL 
SELECT TOP 1 * 
FROM (
    SELECT * 
    FROM TBL_CHARITIES 
    WHERE TBL_CHARITIES.cha_Key NOT IN 
      (
      SELECT members_Favourite 
      FROM TBL_MEMBERS 
      WHERE members_Id = @tmp_ID 
      ) 
     AND (TBL_CHARITIES.cha_Key = '1') 
    EXCEPT 
    SELECT * 
    FROM q 
    ) tc 
END 
Questions connexes