我在运行查询时遇到问题,没有截断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
答案 0 :(得分:1)
Access数据库引擎通常仅使用前255个字符确定文本(“String”)数据的唯一性,这就是DISTINCT
和GROUP 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,它应该给你你想要的东西。