1

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

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

4 回答 4

1

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

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

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 个字符的块是完全没有必要的。You can simply sort on Left(MyMemoCol, 8192) or some other appropriately chosen value for the field length returned.

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

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 个字符(不正确)。

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

于 2009-07-13T22:47:15.287 回答
1

我找到了一个似乎可行的解决方案。我使用“分组依据”来强制区分 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
于 2009-07-15T17:46:59.413 回答
0

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

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

于 2009-07-13T22:14:35.197 回答
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,它应该给你想要的。

于 2009-07-14T14:15:12.470 回答