如何正确使用VIEWS中的DISTINCT

时间:2016-08-08 15:37:35

标签: postgresql hibernate select view distinct

我有两个表,我希望通过这些表与一些列进行连接,以便为我的java / hibernate应用程序提供视图。它看起来像这样:

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个结果

如果我直接使用视图语句

进行相同的查询
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破坏了结果。但为什么呢?

我怎样才能正确使用它?

1 个答案:

答案 0 :(得分:1)

您的查询(基于视图和直接查询)具有不同的应用条件顺序:

  • 直接查询public class OnDataPointListener : Java.Lang.Object, IOnDataPointListener, INotifyPropertyChanged { public void OnDataPoint(DataPoint dataPoint) { foreach (var field in dataPoint.DataType.Fields) { Value val = dataPoint.GetValue(field); } } } ,然后应用%shult%
  • 视图应用distinct on,然后搜索distinct on

你知道%shult%是如何运作的吗? 它选择第一行(如果没有定义适当的排序,它可能是不确定的)给定属性并留下其他属性。

例如:

我们假设我们的客户为distinct on,其中两个关联的联系人为id=1,另一个为name='Schultz'。 现在基于视图的选择将应用name='Schmidt'并选择具有某种联系的客户(第一个,在这种情况下是不确定的),然后distinct on将被应用 - 可能会发生Schultz将被{{1}删除}。

推荐阅读:

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