Ms access 访问查询备注字段因“删除”而截断;独特的;

Ms access 访问查询备注字段因“删除”而截断;独特的;,ms-access,distinct,left-join,truncate,Ms Access,Distinct,Left Join,Truncate,在运行查询时,如果不截断NotesTbl中的note字段或不返回重复条目,我会遇到问题 UID对于AccessTbl不是唯一的。当我省略“distinct”时,注释将返回多次,因为我是在非distinct条件下加入AccessTbl的。当我使用distict时,note字段是trunctated,因为它是一个memo字段 我的问题是: SELECT DISTINCT NotesTbl.pin, NotesTbl.noteid, NotesTbl.note, NotesTbl.date, Acce

在运行查询时,如果不截断NotesTbl中的note字段或不返回重复条目,我会遇到问题

UID对于AccessTbl不是唯一的。当我省略“distinct”时,注释将返回多次,因为我是在非distinct条件下加入AccessTbl的。当我使用distict时,note字段是trunctated,因为它是一个memo字段

我的问题是:

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
编辑:--删除了第一个建议--

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

Access数据库引擎通常确定文本的唯一性('String')仅使用前255个字符的数据,这就是为什么
DISTINCT
GROUP BY
将被截断的原因

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


已发布评论:

将备忘录分解为 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 engine查询对象的SQL视图进行测试,该查询返回一行(不正确),其值被截断为255个字符(不正确)


前面的“分块”查询返回两行(正确),没有截断(正确)。

您还可以在CF端过滤查询对象,以删除(或忽略)已显示的响应。效率不高,但如果您使用的是Access,我猜流量过大不是什么大问题

比如:

<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,它应该能满足您的需要。

我找到了一个似乎有效的解决方案。我使用“分组方式”来强制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

这可能效率较低,因此可能另一个用户可以建议一种不必完整读取两个表的方法。GROUP BY具有与DISTINCT相同的效果,即将备注数据截断为255个字符。Ya。。。我应该知道的。我删除了这个建议。请注意,这些关于“Access数据库引擎”的评论是指Jet 4和更高版本(Jet 4和ACE)。在JET 3.5和之前,一个备忘录字段上的命令将被删除,我认为它实际上比这个字段值的默认截断更可取,所以新手可以首先对不应该排序的字段排序。我强烈的意见?完全没有必要将备忘录分成255个字符的块。您只需根据返回的字段长度按左边(MyMemoCol,8192)或其他适当选择的值排序即可。@David W.Fenton:我编辑了我的答案,以打消您的左()建议,因为它似乎不起作用。@David W.Fenton:“在JET 3.5和之前,一个备忘录字段的订单会被浪费掉,我认为实际上是更可取的。“--哇,你实际上回到了上世纪90年代初的95天前;)说真的,把它贴在Usenet上,PM我的链接,我会贡献;打开,它将很快以“不是问题”的形式关闭。Trey Hunner,感谢您的解决方案。当我以查询的形式运行它时,它工作了。但当我将代码粘贴到预定义报告中时,它返回以下错误/警告:“您试图执行的查询未将特定表达式“xxxx”作为聚合函数的一部分。”我在另一个论坛上读到,这是由GROUP by语句引起的。我找到了解决此错误/警告的方法,即创建查询后,使用Access功能区上的“创建>报告”按钮。它将在没有错误/警告的情况下生成正确的结果。Trey,感谢您发布此解决方案。我从没想过用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