代码之家  ›  专栏  ›  技术社区  ›  Trey Hunner

“distinct”导致的访问查询备注字段截断

  •  1
  • Trey Hunner  · 技术社区  · 16 年前

    在不截断notestbl中的note字段或返回重复条目的情况下运行查询时遇到问题。

    uid对于accesstbl不是唯一的。当我省略“distinct”时,注释将返回多次,因为我在非distinct条件下加入了accesstbl。当我使用Distict时,由于它是一个备忘字段,所以会对“备注”字段进行滚动。

    这是我的问题:

    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 回复  |  直到 9 年前
        1
  •  1
  •   onedaywhen    16 年前

    Access数据库引擎通常只使用前255个字符来确定文本(“字符串”)数据的唯一性,这就是为什么 DISTINCT GROUP BY 将截断。

    这个建议有点冗长,但确实有效:将 MEMO 分成255个字符的块,一定要使用 独特的 在块上,然后将它们重新连接在一起,例如(Access数据库引擎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);
    

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

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

        2
  •  0
  •   anschauung    16 年前

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

    … 另一种方法是将您的请求分成两个查询:一个是优化accesstbl以便uid在查询中是唯一的,另一个是将notestbl连接到您刚刚创建的qryaccesstblunique查询。

        3
  •  0
  •   Ben Doom    16 年前

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

    类似:

    <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,它应该给你想要的。

        4
  •  0
  •   Trey Hunner    16 年前

    我找到了一个可行的解决方案。我用“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