2009-07-13 15 views
1

NotesTblのメモフィールドを切り捨てたり、繰り返しエントリを返さずにクエリを実行する際に問題が発生します。"distinct"によるクエリメモフィールドの切り捨て

UIDはAccessTblでは一意ではありません。私が非独特の条件で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 

答えて

0

解決策が見つかったようです。私はPINとNoteIDの区別を強制するために "グループby"を使いました。私は切り捨てを避けるために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

Trey Hunner、あなたのソリューションに感謝します。私はそれをそのままクエリとして実行しました。しかし、私が定義済みのレポートにコードを貼り付けると、次のエラー/警告が表示されます。 "集計関数の一部として特定の式 'xxxx'を含まないクエリを実行しようとしました。私はそれがGROUP BYステートメントによって引き起こされた別のフォーラムを読みました。 このエラー/警告の回避策を見つけました。つまり、クエリを作成した後、アクセスリボンの[作成]> [レポート]ボタンを使用します。エラー/警告なしで正しい結果が生成されます。 –

0

編集:--Removed最初suggestion--

... もう一つの方法は、2つのクエリにあなたの要求を破るために、次のようになりますので、AccessTblを洗練ワンそのUIDはクエリ内で一意であり、もう一つはNotesTblを今作成したqryAccessTblUniqueクエリに結合するものです。

+0

これはおそらく効率が低いため、別のユーザーが両方の表を完全に読み取る必要がない方法を提案できます。 – anschauung

+0

GROUP BYはDISTINCTと同じ効果があります。つまり、MEMOデータを255文字に切り詰めます。 – onedaywhen

+0

ええと...私はそれを知っていたはずです。私はその提案を削除した。 – anschauung

1

通常、Accessデータベースエンジンはテキスト( '文字列')データの一意性を最初の255文字のみを使用するため、DISTINCTGROUP 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)またはその他の フィールドの長さを適切に選択して、 フィールドを並べ替えるだけで簡単に並べ替えることができます。

私のテストでは、これはまったく機能しません。クイックREPRO:SQL-92クエリモードでAccess2007の.accdb ACEエンジンクエリオブジェクトのSQLビューを使用して試験

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); 

、クエリが(誤った)値が255文字(誤っで切断された単一の行を返します)。

以前の 'チャンク'クエリは、2つの行を返します(正しい)切り捨てなし(正しい)。

+0

「Accessデータベースエンジン」に関するこれらのコメントは、Jet 4以降(Jet 4とACE)を参照していることに注意してください。 Jet 3.5以前では、メモフィールドのORDER BYはちょっとひどくなりました。私は実際にこの暗黙的なフィールド値を切り捨てることが望ましいと考えています。初心者は最初にソートされるべきではないフィールドを並べ替えることができます。私?強い意見? –

+0

メモを255文字のチャンクに分割することは、まったく必要ありません。返されたフィールドの長さに対して、Left(MyMemoCol、8192)またはその他の適切に選択された値を並べ替えることができます。 –

+0

@David W. Fenton:LEFT()の提案を無効にするために私の答えを編集しましたが、それはうまくいかないようです。 – onedaywhen

0

また、既に表示されているレスポンスを削除(または無視)するために、CFの最後のクエリオブジェクトをフィルタリングすることもできます。効率的ではありませんが、Acessを使用している場合は、大量のトラフィックは大きな問題ではないと推測しています。以下のような

何か:nはリターンの多数のために

<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)で醜いことになるだろうが、小さなNのために、それはあなたが望むものをあなたに与える必要があります。

関連する問題