2009-07-13 4 views
1

У меня возникают проблемы с запуском запроса без обрезки поля примечания в NotesTbl или возврата повторяющихся записей.Устранение поля запроса на запрос из-за «отличного»

UID не является уникальным для AccessTbl. Когда я оставляю «отдельные» заметки, они будут возвращаться несколько раз, потому что я присоединяюсь к AccessTbl в неявном состоянии. Когда я использую distict, поле примечания 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 

ответ

0

Я нашел решение, которое работает. Я использовал «группу», чтобы заставить отличиться 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 
+0

Трей Хуннер, спасибо за ваше решение. Он работал, когда я запускаю его как есть, как запрос. Но когда я вставляю коды в свой предопределенный отчет, он возвращает следующую ошибку/предупреждение «Вы пытались выполнить запрос, который не включает конкретное выражение« xxxx »как часть агрегатной функции». Я прочитал на другом форуме, что это вызвано оператором GROUP BY. Я обнаружил обход этой ошибки/предупреждения, то есть - после создания запроса используйте кнопку «Создать отчет» на ленте доступа. Он будет генерировать правильные результаты без ошибки/предупреждения. –

0

Edit: --Removed первый suggestion--

... Другой метод должен был бы разбить запрос на два запроса: один, улучшающий AccessTbl так что UID уникален в запросе, а другой, который соединяет NotesTbl с запросом qryAccessTblUnique, который вы только что создали.

+0

Это, вероятно, менее эффективно, поэтому, возможно, другой пользователь сможет предложить метод, который не должен читать обе таблицы целиком. – anschauung

+0

GROUP BY имеет такой же эффект, как DISTINCT, т. Е. Обрезает данные MEMO до 255 символов. – onedaywhen

+0

Я ... Я должен был это знать. Я удалил предложение. – anschauung

1

Механизм базы данных Access обычно определяет уникальность данных текста ('String'), используя только первые 255 символов, и поэтому DISTINCT и 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-символьных кусков является полностью не нужно. Вы можете просто отсортировать по Left (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 о наличии Access2007 .accdb ACE объекта двигателя запрос в режиме SQL-92 запросов, то запрос возвращает одну строку (неправильный), значение которого было усечен в 255 символов (неправильное).

Ранее запрос «chunking» возвращает две строки (правильные) без усечения (правильно).

+0

Обратите внимание, что эти комментарии о «двигателе базы данных доступа» относятся к Jet 4 и более поздним версиям (Jet 4 и ACE). В Jet 3.5 и ранее ORDER BY в поле memo просто вылезает, что я считаю предпочтительным для этого негласного усечения значений полей, так что новички могут сортировать поля, которые никогда не должны сортироваться в первую очередь. Меня? Сильные мнения? –

+0

Ломать записку до 255-символьных фрагментов совершенно не нужно. Вы можете просто отсортировать слева (MyMemoCol, 8192) или другое подходящее выбранное значение для возвращаемой длины поля. –

+0

@David W. Fenton: Я отредактировал свой ответ, чтобы уменьшить ваше предложение LEFT(), потому что оно, похоже, не работает. – onedaywhen

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> 

Для большого числа возвратов п, это будет некрасиво в O (N^2), но и для малых п, он должен дать вам то, что вы хотите.