由于“distinct”而导致的Access Query Memo字段截断

时间:2009-07-13 21:49:37

标签: ms-access distinct left-join truncate

我在运行查询时遇到问题,没有截断NotesTbl中的note字段或返回重复的条目。

UID对于AccessTbl不是唯一的。当我遗漏“不同”的笔记将多次返回,因为我在一个非独特的条件下加入AccessTbl。当我使用distict时,note字段被截断,因为它是一个备忘录字段。

这是我的问题:

SELECT DISTINCT NotesTbl.pin, NotesTbl.noteid, NotesTbl.note, NotesTbl.date,
AccessTbl.affiliation, AccessTbl.name
FROM NotesTbl
LEFT JOIN AccessTbl
ON NotesTbl.UID = AccessTbl.UID
WHERE PIN = #pin#
AND UID = '#uid#'
ORDER BY NotesTbl.DATE DESC

4 个答案:

答案 0 :(得分:1)

Access数据库引擎通常仅使用前255个字符确定文本(“String”)数据的唯一性,这就是DISTINCTGROUP BY将被截断的原因。

这个建议有点长,但它确实有效:将MEMO拆分成255个字符的块,在块上使用DISTINCT,然后再将它们连接在一起,例如(访问数据库引擎ANSI-92查询模式语法,即子查询的parens):

SELECT DT2.MyMemoCol_1 & DT2.MyMemoCol_2 AS MyMemoCol
  FROM (
        SELECT DISTINCT DT1.MyMemoCol_1, DT1.MyMemoCol_2
        FROM (
              SELECT MID(MyMemoCol, 1, 255) AS MyMemoCol_1, 
                     MID(MyMemoCol, 256, 255) AS MyMemoCol_2 
                FROM Test1
             ) AS DT1
       ) AS DT2;

评论已发布:

  

打破备忘录   完全是255个字符的块   不必要。你可以简单地排序   左(MyMemoCol,8192)或其他   适当选择的价值   字段长度返回。

嗯,在我的测试中,这根本不起作用。快速复制:

CREATE TABLE Test1 (MyMemoCol MEMO NOT NULL);

INSERT INTO Test1 (MyMemoCol) VALUES (STRING(300, 'A'));
INSERT INTO Test1 (MyMemoCol) VALUES (STRING(300, 'A') & STRING(5, 'X'));
INSERT INTO Test1 (MyMemoCol) VALUES (STRING(300, 'A'));

SELECT LEFT$(MyMemoCol, 8192)
  FROM Test1
 GROUP 
    BY LEFT$(MyMemoCol, 8192);

在SQL-92查询模式下使用Access2007 .accdb ACE引擎查询对象的SQL视图进行测试时,查询返回单行(不正确),其值已被截断为255个字符(不正确)。

较早的'chunking'查询返回两行(正确)而没有截断(正确)。

答案 1 :(得分:1)

我找到了似乎有效的解决方案。我使用“group by”来强制PIN和NoteID的清晰度。我试图通过使用First()来排除明显比较中的注释,以避免截断。

SELECT NotesTbl.pin, NotesTbl.noteid, First(NotesTbl.note) as notebody, NotesTbl.date,
AccessTbl.affiliation, AccessTbl.name
FROM NotesTbl
LEFT JOIN AccessTbl
ON NotesTbl.UID = AccessTbl.UID
WHERE PIN = #pin#
AND UID = '#uid#'
GROUP BY pin,affiliation,name,date,noteid
ORDER BY NotesTbl.DATE DESC

答案 2 :(得分:0)

编辑: - 删除第一个建议 -

... 另一种方法是将您的请求分成两个查询:一个优化AccessTbl以使UID在查询中是唯一的,另一个将NotesTbl连接到您刚刚创建的qryAccessTblUnique查询。

答案 3 :(得分:0)

您还可以过滤CF端的查询对象,以删除(或忽略)已显示的响应。效率不高,但如果您使用的是Acess,我猜测交通拥堵不是一个大问题。

类似的东西:

<cfoutput query="notes">
   <cfset diplay="true">
   <cfloop from="1" to="#notes.currentrow-1#">
       <cfif note neq notes.note[i]>
            <cfset display="false">
       </cfif>
    </cfloop>
    <cfif display>
       #note#
    </cfif>
</cfoutput>

对于大量的回报n,这在O(n ^ 2)处会很难看,但对于小n,它应该给你你想要的东西。