2009-07-21 38 views
0

感謝來自很多人的幫助,我們給出了以下代碼,它非常棒。然而,我認識到我錯過了一些重要的信息,所以在這裏轉貼(用更新後的代碼)來澄清。SP:隨機記錄,Fave Record,加上已知記錄,無重複

下面的代碼從表5個隨機記錄以及基於在第二表中標識用戶的喜愛進一步單記錄:

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'」,如果它不與上面代碼中第二個SELECT語句中返回的記錄相同。

有意義嗎?

謝謝!!!

+0

能否請您提供一些樣本數據和一個結果,你想要得到? – Quassnoi 2009-07-21 15:01:07

回答

1

我不能完全肯定我理解你,但我相信它是這樣的......

五隨機記錄,而不#1 一個用戶特定的記錄 記錄#1,如果它不是用戶的特定記錄。

如果是這樣,我認爲這確實是:

 

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