Firebird删除SELECT LIST子查询

时间:2017-04-27 16:20:08

标签: sql firebird aggregation firebird2.5

我正在使用Firebird数据库v2.5,我无法从查询中删除重复的行:

SELECT  DISTINCT u.id_user, 
        (SELECT LIST(g.id_user) 
         from gen g 
         where g.id_user=u.id_user 
         GROUP BY id_user) as list_g_user
FROM users u 
where  u.id_user = 1 
  INNER JOIN ...

这是我的结果:

 id_user  |  list_g_user 
===================================
1         |  437,499,718,739,835,865
1         |  437,499,718,739,835,865
1         |  437,499,718,739,835,865
1         |  437,499,718,739,835,865

第二列结果list_g_user是BLOB类型。

相同的结果和多行。 有人可以解释原因吗?

这是功能参考:Firebird Documentation: LIST()

2 个答案:

答案 0 :(得分:1)

正如JNevill distinct已经指出blob does not behave as expected in Firebird:它会比较blob id(指向blob的'指针'),而不是Blob的内容,{ {3}}生成一个blob。

要解决此问题,有几种可能的解决方案:

  1. list()的结果投放到varchar,以便可以正确比较,例如:

    SELECT cast(LIST(g.id_user) as varchar(100)) ...
    

    但这确实意味着列表的字符长度不应超过varchar长度(本例中为100)。

  2. 您在查询中使用inner join而不使用联接表中的任何内容,似乎建议您仅使用联接作为存在检查。用exists支票替换该联接:

    SELECT u.id_user, 
            (SELECT LIST(g.id_user) 
             from gen g 
             where g.id_user=u.id_user 
             GROUP BY id_user) as list_g_user
    FROM users u 
    where  u.id_user = 1 
    and exists (select * from <currently joined table> x where x.id_user = u.id_user)
    
  3. 正如JNevill在评论中所建议的那样,您可以尝试在顶级查询中使用group by id_user,但这可能并不总是有效,因为它依赖于相邻的blob ID。在无法使用group by的情况下,它不是一个可行的解决方案:

    SELECT  DISTINCT u.id_user, 
            (SELECT LIST(g.id_user) 
             from gen g 
             where g.id_user=u.id_user 
             GROUP BY id_user) as list_g_user
    FROM users u 
    where  u.id_user = 1 
      INNER JOIN ...
    group by u.id_user
    

答案 1 :(得分:1)

SELECT  DISTINCT u.id_user,
        CAST(SUBSTRING((SELECT LIST(g.id_user)
         from gen g
         where g.id_user=u.id_user
         GROUP BY id_user) FROM 1 FOR 1000) AS VARCHAR(1000)) as list_g_user
FROM users u
where  u.id_user = 1
  INNER JOIN ...