1

4 つの異なるテーブルからレコードを取得するクエリがあります。私はunion最終的な記録を取得するために使用しています。私の問題は、4つのテーブルすべてに同じ数とタイプの列がないため、null値を持つダミー列を作成していることです。私が直面している問題はソートにあります。datetime desc を使用してレコードを並べ替えていますが、日付が同じ場合、高、中、または Null タイプのアラートで 2 番目の並べ替え列が必要になることがあります。一番下にNull列が欲しいのですが、一番上に来ています。ISNULL(column_name, 'aaaa')そのため、 in句を使用しようとしましORDER BYたが、実際の結果が得られません。誰でも助けることができますか?

SELECT CreatedDt as 'Date/Time' , null AS [Alert_Type] FROM TblA
union  
SELECT CreatedDt as 'Date/Time' , null AS [Alert_Type] FROM TblB
union  
SELECT CreatedDt as 'Date/Time' , null AS [Alert_Type] FROM TblC
union
SELECT CreatedDt as 'Date/Time' , Alert_Type FROM TblD
ORDER BY CreatedDt, ISNULL (Alert_Type,'aa') DESC

エラーは

ORDER BY items must appear in the select list if the statement contains a UNION, INTERSECT or EXCEPT operator.

ありがとうございました..

4

3 に答える 3

4

これを試して:

select * from (

SELECT CreatedDt as 'Date/Time' , null AS [Alert_Type] FROM TblA
union  
SELECT CreatedDt as 'Date/Time' , null AS [Alert_Type] FROM TblB
union  
SELECT CreatedDt as 'Date/Time' , null AS [Alert_Type] FROM TblC
union
SELECT CreatedDt as 'Date/Time' , Alert_Type FROM TblD)a
order by CreatedDt desc, 
         case when Alert_Type is null then 0 else 1 end
于 2012-09-28T09:41:56.813 に答える
3

Alert_Typeで NULL になれない場合はTblD、次のようにすることができます。

SELECT CreatedDt as 'Date/Time' , 'aa' AS [Alert_Type] FROM TblA
union  
SELECT CreatedDt as 'Date/Time' , 'aa' AS [Alert_Type] FROM TblB
union  
SELECT CreatedDt as 'Date/Time' , 'aa' AS [Alert_Type] FROM TblC
union
SELECT CreatedDt as 'Date/Time' , Alert_Type FROM TblD
ORDER BY CreatedDt DESC, Alert_Type DESC

DESCafter に注意してくださいCreatedDt(datetime 列で降順で並べ替えたいと言ったため)。

于 2012-09-28T10:13:48.143 に答える
1

あなたはまだCASEあなたのORDER BY句で使うことができます

ORDER BY  CASE WHEN column_name IS NULL
               THEN 1
               ELSE 0
          END ASC --, other sorts
                  -- in these case NULL columns should be on the bottom part
于 2012-09-28T09:25:18.753 に答える