2012-04-05 11 views
1
SELECT TOP 5 
    Notices.Id, 
    NoticeLoc.Notices_Id, 
    Loc.Id as Loc_Id, 
    CAST(Notices.Text AS TEXT) as Text, 
    CAST(Notices.Title AS TEXT) as Title, 
    Notices.CDate as RDate 
FROM NoticeLoc 
    JOIN Notices ON NoticeLoc.Notices_Id=Notices.Id JOIN Loc ON NLoc.Loc_Id=Loc.Id WHERE Loc_Id IN (1) 

UNION 

SELECT TOP 5 
    Notices.Id, 
    '', 
    '', 
    CAST(Notices.Text AS TEXT) as Text, 
    CAST(Notices.Title AS TEXT) as Title, 
    Notices.CDate as RDate 
FROM NoticeC 
    JOIN Notices ON NoticeC.Notices_Id=Notices.Id WHERE C_Id=110 AND CDate BETWEEN '10/01/2011' AND '07/14/2025' ORDER BY RDate desc 

を失敗し、私は、しかし、私は次のエラーを取得しています、MSSQLを使用して2つの結果セットの間で労働組合を実行しようとしています:SQL連合

Msg 421, Level 16, State 1, Line 1 The text data type cannot be selected as DISTINCT because it is not comparable.

私は、テキストフィールドとしてそれらのフィールドを維持する必要があります。

どのようにこれを解決できますか?

+1

SQLクエリをフォーマットできますか?誰もそれを読むことはできません。 – Cylindric

+0

'TEXT'の代わりに' VARCHAR(MAX) 'を使用できない理由は何ですか?あなたは結局それらをキャストしています.. – Seph

答えて

5

UNIONはDISTINCTを使用していると解釈されます(おそらくUNIONが2つのクエリを本質的に1つのDISTINCTリストにメッシュしようとしているためです)。 UNION ALLを使用します。

+0

ありがとうトリックでした。 :) – bobo2000

+3

UNION ALLは(おそらく)実際の結果セットを変更します。つまり、すべての行が返されます。単純なUNIONでは重複しません。 MSSQLの –

0

問題はデータの種類(TEXT)です。代わりにVARCHAR(MAX)を使用するようにテーブルを変更できますか?または、TEXTフィールドを共用体から削除しますか?または、クエリのVARCHAR(MAX)にフィールドをキャストするだけですか?

VARCHAR(MAX)は、機能的にはテキスト(長さは無制限、行には格納されません)と同じです。

+0

には、varcharというものはありません.nvarcharだけです。これはPHPで大きな問題を引き起こします。 – bobo2000

+0

mmm ....私はかなりvarcharとnvarcharがMSSQLに存在することは確かですか? –

+0

MSSQLデータ型:http://msdn.microsoft.com/en-us/library/ms187752.aspx –