2016-08-08 48 views
1

我從我想拍一些列的連接,爲我的Java提供了一個視圖/休眠應用兩個表。它看起來像這樣:如何使用DISTINCT VIEWS正確

CREATE VIEW customer_contacts AS cc 
SELECT DISTINCT ON (cust.id) cust.id 
    cust.company 
    cust.zip 
    ... 
    con.name 
    con.forename 
    ... 
FROM contacts con 
LEFT JOIN customer cust ON con.customer = cust.id 
ORDER BY cust.id 

到目前爲止好。很簡單。 如果我做出的觀點一樣,一個SELECT:

SELECT * 
FROM cc 
WHERE name ilike '%schult%' 

我得到13結果

如果我做出同樣的查詢直接與view語句

SELECT DISTINCT ON (cust.id) cust.id 
    cust.company 
    cust.zip 
    ... 
    con.name 
    con.forename 
    ... 
FROM contacts con 
LEFT JOIN customer cust ON con.customer = cust.id 
WHERE name ilike '%schult%' 
ORDER BY cust.id 

75結果! 我發現這是破壞結果的DISTINCT。但爲什麼?

我怎樣才能正確地使用它?

+3

請出示了 「同一個查詢」,你正在運行的確切SQL文本。 –

+0

嗨,彼得,我澄清了我的問題,我寫了直接的聲明。 – M46

+0

但是你在第二個查詢中忘記了'WHERE name ilike'%schult%''的條件... –

回答

1

你的查詢(查看基於直接)有不同順序的應用條件:

  • %shult%直接查詢搜索,然後應用distinct on
  • 視圖適用distinct on,然後搜索%shult%

您是否知道distinct on的工作原理? 它爲給定的屬性選擇第一行(如果沒有定義正確的排序,它可能是不確定的),並留下其他的。

例如:

比方說,我們有客戶與id=1且相連的兩個觸點與一個和name='Schultz'用一個name='Schmidt'。 立即查看基於選擇適用distinct on和選擇客戶與一些接觸(第一位的,在這種情況下undeterministic),然後name ilike '%schult%'將應用 - 這可能發生舒爾茨將distinct on被刪除。


推薦閱讀:

https://www.postgresql.org/docs/9.0/static/sql-select.html#SQL-DISTINCT

+0

謝謝。你的第一點很清楚,我在postgre Doc中找到了它。第二個不是。但我的問題仍然存在:我如何正確地做到這一點。我的意思是,如果沒有視圖,我怎麼才能得到我想要的結果?我使用Hibernate並不想使用查詢。這就是爲什麼我想要使用視圖。 – M46

+0

並順便說一句。在這個特殊情況下的結果將是相同的,因爲沒有重複。所以訂單應該不重要。在其他查詢中是可能的。 – M46

+0

我不明白:「沒有重複」。如果沒有重複項,則兩個查詢都會返回相同的數據。 –