我正在使用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类型。
相同的结果和多行。 有人可以解释原因吗?
答案 0 :(得分:1)
正如JNevill distinct
已经指出blob does not behave as expected in Firebird:它会比较blob id(指向blob的'指针'),而不是Blob的内容,{ {3}}生成一个blob。
要解决此问题,有几种可能的解决方案:
将list()
的结果投放到varchar
,以便可以正确比较,例如:
SELECT cast(LIST(g.id_user) as varchar(100)) ...
但这确实意味着列表的字符长度不应超过varchar长度(本例中为100)。
您在查询中使用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)
正如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 ...