Postgresql 如何在视图中正确使用DISTINCT
我有两个表,我想从中加入一些列,为我的java/hibernate应用程序提供一个视图。看起来是这样的:Postgresql 如何在视图中正确使用DISTINCT,postgresql,hibernate,select,view,distinct,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 =
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 *
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个结果!
我发现这是明显的,破坏了结果。但是为什么呢
如何正确使用它?您的查询(基于视图和直接查询)的应用条件顺序不同:
- 直接查询搜索
,然后在%shult%
- 视图在上应用不同的
,然后搜索
%shult%
是如何工作的?
它为给定属性选择第一行(如果未定义适当的排序,则可能无法确定),并留下其他行
例如:
假设我们有一个id=1的客户和两个连接的联系人,一个是name='Schultz'
,另一个是name='Schmidt'
。
现在,基于视图的选择将在
上应用distinct,并选择具有某些联系人的客户(第一个,在本例中不确定),然后将应用名称,如“%schult%”
,可能会在
上通过distinct删除Schultz
建议阅读:
请显示您正在运行的“同一查询”的确切SQL文本。嗨,Peter,我澄清了我的问题,并编写了直接语句。但是您忘记了条件在您的第二个查询中,我喜欢“%schult%”的地方。
,您说得对!但是现在谢谢。你的第一点很清楚,我在博士后博士那里找到了。第二个不是。但我的问题仍然是:我如何才能正确地做到这一点。我的意思是,如果没有视图,我如何得到我想要的结果?我正在使用Hibernate,不想使用查询。这就是为什么我想使用视图。顺便说一下。在这种非常特殊的情况下,结果将是相同的,因为没有重复。所以顺序不重要。在其他查询中,这是可能的。我不明白:“没有重复项”。如果没有重复项,两个查询都将返回相同的数据。在这种情况下,当我添加where子句(where name ilike“%schulte%”时,结果不同,这正是问题所在。两个查询返回不同的结果!但是当我尝试例如“where city ilike“%Berlin%”时,结果是相同的!