2013-08-29 27 views
1

我們有這四個表:以下是查找表中隨機行的一種可能方法嗎?有更好的方法嗎?

Store (
    row bigint, 
    id uniqueidentifier, 
    name varchar 
) 

Products (
    row bigint, 
    id uniqueidentifier, 
    storeID uniqueidentifier, 
    productname varchar 
) 

Customer (
    row bigint, 
    id uniqueidentifier, 
    storeID uniqueidentifier, 
    fName, 
    lName, 
    email 
) 

orders (
    row bigint, 
    id uniqueidentifier, 
    store_ID uniqueidentifier, 
    cust_id uniqueidentifier, 
    prod_id uniqueidentifier, 
    date datetime 
) 

我們需要找到訂單表30個的隨機行特定商店。

這是我第一次嘗試它:

select TOP 30 * from orders o inner join store s on o.Retailer_ID=s.ID 
    where s.Name='XXXX' and o.Row in (select ABS(CAST(CAST(NEWID() AS  
       VARBINARY) AS int)) %100000 from orders) and o.Retailer_ID =(select ID 
        from store s where s.Name= 'XXXX') 

但我不是真正滿意的結果,因爲我覺得行的範圍絕不會單一數字和隨機運算方法,我做的只是在從第1行到第max-number行創建一個真正的隨機數似乎不是那麼好。我不確定第一個訂單表中有多少行可能是另一個問題。

有沒有更好的方法來查找表中的隨機行?

+0

爲什麼不簡單做SELECT TOP ... ORDER BY NEWID()? –

回答

3

你也可以這樣來做:

select TOP 30 * 
from orders o inner join 
    store s 
    on o.Retailer_ID = s.ID 
where s.Name='XXXX' 
order by newid(); 

這是通過隨機排序的數據,然後選擇前30行返回隨機行。在SQL Server中,按newid()排序是隨機排序數據的一種方法。

+0

非常感謝,看起來像一個很好的查詢。所以每次運行這個查詢時,我都會得到給定商店的不同訂單?我試圖在我的服務器上運行這個,並且我沒有得到任何行? –

+1

@JeromeLandis。 。 。我只注意到'in'子句是多餘的,但是不應該對行進行任何過濾。查詢是否返回沒有'order by'的東西? –

+0

感謝您的快速回復。它確實現在返回行。這個問題可能是因爲我的測試系統中沒有很多行,所以我會嘗試添加另外50行左右的行,看看我是否可以隨時用查詢生成隨機行。我真的不明白的一件事是它如何生成隨機行。如果你對此發表評論,那會很好。我認爲newid()的順序與它有關,但我不明白它爲什麼在那裏......謝謝先生! –

4

事情要簡單得多。

select TOP 30 * 
    from orders o 
     join store s on o.Retailer_ID=s.ID 
    where s.Name='XXXX' 
    order by newid() 
+0

非常感謝,看起來像一個很好的查詢。所以每次運行這個查詢時,我都會得到給定商店的不同訂單?我試圖在我的服務器上運行這個,並且我沒有得到任何行? –

相關問題