执行 SQL select distinct except BLOB 字段
Performing SQL select distinct except BLOB field
我需要 select table 上的一些 DISTINCT 字段,但我需要从 distinct 中排除 blob,因为 distinct 不考虑 BLOB 字段。
我试着在这里寻找一些东西,但是 this 是我找到的,但它对我不起作用,
Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 3, column 76.
(.
----------------------------------
SQLCODE: -104
SQLSTATE: 42000
GDSCODE: 335544569
这是我使用的查询(我修改了名称,因为它来自工作)
SELECT Field1, Field2, Field3, Blob1, Blob2
FROM (
SELECT Field1, Field2, Field3, Blob1, Blob2, row_number() over (partition by Field1, Field2, Field3 order by Field1) RW
FROM Table
) WHERE RW = 1;
除了那篇文章中建议的方法之外,还有其他方法吗?
您在另一个问题中发现的查询是 Firebird 2.5 中的语法错误,但可能在 Firebird 3.0 中有效(虽然我没有验证),因为这是引入的版本 window像 row_number()
.
这样的函数
但是,如果您只想要一个 blob(哪个无关紧要)用于字段组合,那么您可以这样做:
select a.field1, a.field2, a.field3,
(select first 1 blob1 from table1 where field1 = a.field1 and field2 = a.field2 and field3 = a.field3) as blob1,
(select first 1 blob2 from table1 where field1 = a.field1 and field2 = a.field2 and field3 = a.field3) as blob2
from (
select distinct field1, field2, field3
from table1
) a
或
select field1, field2, field3, min(blob1) as blob1, min(blob2) as blob2
from table1
group by field1, field2, field3
此查询可能会导致来自不同行的 blob1 和 blob2。
如果你想要所有不同的 blob,那么你可以做类似下面的事情(这不是 100% 万无一失的,因为 hash
会产生碰撞,而且它可能会非常慢) :
select b.field1, b.field2, b.field3, b.blob1, b.blob2
from (
select distinct field1, field2, field3, hash(blob1) as hash1, hash(blob2) as hash2
from table1
) a
inner join table1 b
on b.field1 = a.field1 and b.field2 = a.field2 and b.field3 = a.field3
and hash(b.blob1) = a.hash1 and hash(b.blob2) = a.hash2
我需要 select table 上的一些 DISTINCT 字段,但我需要从 distinct 中排除 blob,因为 distinct 不考虑 BLOB 字段。
我试着在这里寻找一些东西,但是 this 是我找到的,但它对我不起作用,
Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 3, column 76.
(.
----------------------------------
SQLCODE: -104
SQLSTATE: 42000
GDSCODE: 335544569
这是我使用的查询(我修改了名称,因为它来自工作)
SELECT Field1, Field2, Field3, Blob1, Blob2
FROM (
SELECT Field1, Field2, Field3, Blob1, Blob2, row_number() over (partition by Field1, Field2, Field3 order by Field1) RW
FROM Table
) WHERE RW = 1;
除了那篇文章中建议的方法之外,还有其他方法吗?
您在另一个问题中发现的查询是 Firebird 2.5 中的语法错误,但可能在 Firebird 3.0 中有效(虽然我没有验证),因为这是引入的版本 window像 row_number()
.
但是,如果您只想要一个 blob(哪个无关紧要)用于字段组合,那么您可以这样做:
select a.field1, a.field2, a.field3,
(select first 1 blob1 from table1 where field1 = a.field1 and field2 = a.field2 and field3 = a.field3) as blob1,
(select first 1 blob2 from table1 where field1 = a.field1 and field2 = a.field2 and field3 = a.field3) as blob2
from (
select distinct field1, field2, field3
from table1
) a
或
select field1, field2, field3, min(blob1) as blob1, min(blob2) as blob2
from table1
group by field1, field2, field3
此查询可能会导致来自不同行的 blob1 和 blob2。
如果你想要所有不同的 blob,那么你可以做类似下面的事情(这不是 100% 万无一失的,因为 hash
会产生碰撞,而且它可能会非常慢) :
select b.field1, b.field2, b.field3, b.blob1, b.blob2
from (
select distinct field1, field2, field3, hash(blob1) as hash1, hash(blob2) as hash2
from table1
) a
inner join table1 b
on b.field1 = a.field1 and b.field2 = a.field2 and b.field3 = a.field3
and hash(b.blob1) = a.hash1 and hash(b.blob2) = a.hash2