2015-10-26 30 views
0

我不明白,這個查詢是如何工作的postgresql 9.4/9.5 - 從generate_series中選擇(常量值)作爲id - 此查詢如何工作?

select * from users 
where id in (
    select round(random() * 21e6)::integer as id 
    from generate_series(1, 110) -- Preserve duplicates 
) 
limit 100 

來源:https://www.periscopedata.com/blog/how-to-sample-rows-in-sql-273x-faster.html

如果我試圖在自然語言翻譯,這將是:

  • SELECT * FROM用戶其中id在... =>選擇所有在值內有id的用戶...
  • select round(random()* 21e6):: integer as id =>如何選擇一個數字,在這裏就像「select 3500作爲ID「 。我認爲通常你會選擇一個列,例如'select company_name as name ???'而不是'select 15 as name'
  • from generate_series(1,110)=>如何選擇3500作爲id,然後告訴他從一個序列中選擇3500(1,2,3,...,108,109,110)

我真的不明白這個複雜的查詢。

有人能幫我理解每一步嗎?

回答

1

你對主查詢有正確的想法,但似乎大多被子查詢困惑。讓我看看我是否可以解釋:

基本的想法是,你想獲得110個隨機數。您可以使用random()來獲取數字,應用一些數學運算將其轉換爲您要查找的數字,然後從generate_series中選擇以重複該過程110次。

現在讓我們詳細分解它。讓我們先從基本的select語句:

select some_number from some_table;

但不是一個普通的表,讓我們使用generate_series。這是一個返回一列表的函數。該查詢返回一個包含數字1到110 110行:

select generate_series from generate_series(1, 110);

它返回一個數字,所以你可以做多少一些數學:

select generate_series * 2 + 3500 from generate_series(1, 110);

但如果我們做什麼這:(你會同意它應該工作,對吧?)

select generate_series * 0 + 3500 from generate_series(1, 110);

這恰恰像是在說:

select 3500 from generate_series(1, 110);

這好像是說:

select 3500::integer from generate_series(1, 110);

和,因爲任何整數工作,你也可以這樣做:

select round(random() * 21e6)::integer from generate_series(1, 110);

最後,你可以像這樣重命名列:

select round(random() * 21e6)::integer as id from generate_series(1, 110);

...並有查詢。

+0

非常感謝您的幫助 – Mathieu