Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 如何在视图中正确使用DISTINCT_Postgresql_Hibernate_Select_View_Distinct - Fatal编程技术网

Postgresql 如何在视图中正确使用DISTINCT

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 =

我有两个表,我想从中加入一些列,为我的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 * 
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%”时,结果是相同的!