[Oracle SQL]根据在另一个查询中找到结果的位置选择结果

时间:2017-08-03 19:10:09

标签: sql oracle

我根据用户数据查询了搜索页面;也就是说,用户应该只能搜索其结果与他们自己的结果相似的其他用户。由于每个结果都在其各自的表中的自己的行中,因此我使用oracle的listagg()函数来生成用户记录列表。

有没有办法在两组记录之间搜索相似之处? 例如,像:

select <data> from (select listagg(data, ', ')...where userid='<whatever>')
where <data> in (select listagg(data, ', ')...where userid='<whatever>')

显然这是伪代码,但假设&#39; ...&#39;表示为简洁起见而省略的有效语法。同样简洁起见,我只包括一个例子;有几个领域我会过滤,但我认为它们应该或多或少都像这样。每当我尝试类似的东西时,我发现的是listagg函数以&#39; x,y,z&#39;的格式返回,而不是&#39; x&#39;,&#39; ; y&#39;,&#39; z&#39;,这导致查询(使用IN)不返回任何结果,因为没有&#39; x,y,z&#39;值。

2 个答案:

答案 0 :(得分:0)

这是一种更好的方法

@objc

建立相似性可能是困难的部分。在尝试编写代码之前,请确保您已了解相关规则。

答案 1 :(得分:0)

我认为OP要求......

SELECT a_concatenation_fxn_like_listagg(T1.FieldsOfInterest) as result
FROM theTables T1,
  (select FieldsOfInterest
   from theTables
   where userid = "user2"  //different user from T1
  ) as T2
WHERE
  T1.userid = "user1" 
   AND (
        T1.FieldOfinterest1 like '%'||T2.FieldOfinterest2||'%'
        OR
        T1.FieldOfInterest2 like '%'\\T2.FieldOfInterest2||'%'  //for string similarity
        OR
        ABS(T1.FieldOfInterest3 - T2.FieldOfInterest3) < tolerance //for numeric similarity
       )