有没有办法在一个查询中查找多列的所有不同值?

时间:2011-06-07 18:05:44

标签: sql oracle oracle9i

我非常感谢以下问题的一些帮助/指示。

背景资料:

数据库版本:Oracle 9i

Java版本:1.4.2

问题

我有一个数据库表,其中有多列代表有关文档的各种元数据。

E.g:

CREATE TABLE mytable
(
document_id integer,
filename varchar(255),
added_date date,
created_by varchar(32),
....
)

由于网络服务器和数据库服务器之间存在网络/延迟问题,我希望尽量减少对数据库的查询次数。

文档列在网页中,但有数千种不同的文档。

为了帮助导航,我们在网页上提供过滤器以仅选择与特定值匹配的文档 - 例如由用户'joe bloggs'创建或在'01 -01-2011'创建。此外,提供了分页,因此触发db调用以获取接下来的50个文档或其他内容。

网页本身保持相当愚蠢 - 它们只呈现java servlet返回的内容。目前,通过对每列上的不同值进行单独查询,为每个过滤器提供了不同的值。

这需要相当长的时间,因为网络延迟和它意味着5个额外的查询。

我的问题

我想知道是否有办法在一个查询中获取相同的信息?

例如,有没有办法通过以下形式从该表中获取不同的结果:

DistinctValue    Type
01-01-2011       added_date
01-02-2011       added_date
01-03-2011       added_date
Joe Bloggs       created_by
AN Other         created_by
....             ...

我猜测上面的一个问题是各列的数据类型不同,因此日期和变量不能同时在“DistinctValue”列中返回。

这个问题有更好/标准的方法吗?

非常感谢提前。

修改

正如我在下面的评论中提到的,我想到了一种可能更多的内存/负载有效方法,它消除了加入查询的原始要求 -

  

我想其他可行的方法是   而不是填充下拉列表   最初,让他们对用户做出反应   打字,然后有一个“建议者”   风格下拉出现的只是那些   与输入匹配的不同值   文本。我认为这意味着a)   保持单独的查询   不同的值,但b)只运行   根据需要单独查询,   c)减少结果集   过滤上的唯一值   用户的文字。

2 个答案:

答案 0 :(得分:4)

此查询将返回上面描述的输出:

SELECT DocumentID As DocumentID, 'FileName' As AttributeType, FileName As DistinctValue
 FROM TableName
UNION
SELECT DocumentID, 'Added Date', Added_date FROM TableName
UNION
SELECT DocumentID, 'Created By', created_by FROM TableName
UNION
....

如果您有权使用此SQL创建视图,则可以将其用于查询。

答案 1 :(得分:0)

  

由于网络/延迟问题   在网络服务器和数据库之间   服务器,我想尽量减少   查询的数量   数据库中。

     

文档列在网页中   页面,但有成千上万   不同的文件。

您可能需要查看Lucene。每当我看到“最小化对db的查询”并结合“搜索文档”时,这就是我的想法。我已经非常成功地使用了它,并且可以用于只读或更新环境。 Oracle的答案是Oracle Text,但是(无论如何)对于设置和使用它来说有点熊。取决于贵公司的技术资源和优势。

无论如何,对于每个连接,确实胜过数据库的多个查询。