2017-08-16 10 views
1

何らかの理由により、私はテーブルを変更したり、データを更新することができません。ここで問題:SQLServerによる注文IGNORE NULL値

私は以下のmenu_user表があります。

userID menuID 
(null) 2 
(null) 3 
1  3 
2  1 
3  2 
4  5 
5  0 

userIDmenuID重複していません。問題はORDER BY userID, menuIDですが、userIDにNULL値がある場合、同じmenuIDを持つ別の行が検索され、この行の後に配置されます。 menuIDだけで最大2同じ値を持っており、それが持っている場合は、別の一つはNULLでなければなりません

期待されるため結果:ここで

userID menuID 
1  3 
(null) 3 
2  1 
3  2 
(null) 2 
4  5 
5  0 

スクリプトのサンプル: の場合を追加しました

CREATE TABLE [dbo].[menu_user](
    [userID] [int] NULL, 
    [menuID] [int] NULL 
); 

INSERT [dbo].[menu_user] ([userID], [menuID]) VALUES (NULL, 3); 
INSERT [dbo].[menu_user] ([userID], [menuID]) VALUES (1, 3); 
INSERT [dbo].[menu_user] ([userID], [menuID]) VALUES (2, 1); 
INSERT [dbo].[menu_user] ([userID], [menuID]) VALUES (3, 2); 
INSERT [dbo].[menu_user] ([userID], [menuID]) VALUES (4, 5); 
INSERT [dbo].[menu_user] ([userID], [menuID]) VALUES (5, 0); 
INSERT [dbo].[menu_user] ([userID], [menuID]) VALUES (NULL, 2); 

可能であれば、私はこのスクリプトをView(変数なしのSELECT)として欲しいです。

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

+1

ビューとして表示することはできません。ビュー(テーブルのような)には固有の順序はありません。この質問はすべてオーダーについてのものなので、うまくいきません。 –

+0

@Damien_The_Unbeliever:あなたはそれが正しいと思う、ありがとう。 –

答えて

1

これはトリックを行うようです。複数の行を関連付けるには、何かする必要があります。

select 
    m1.* 
from 
    menu_user m1 
     left join 
    menu_user m2 
     on 
      m1.userID is null and 
      m1.menuID = m2.menuID and 
      m2.userID is not null 
order by 
    COALESCE(m1.userID,m2.userID),m1.userID desc 

結果:

userID  menuID 
----------- ----------- 
1   3 
NULL  3 
2   1 
3   2 
NULL  2 
4   5 
5   0 

うまくいけば、あなたはそれがその目的を達成していますどのように見ることができますここで私はleft joinを使用することを選択しました。

+0

ありがとう、私は 'select * 'で完全に理解しています。そして、私は完全な例を作りませんでした、申し訳ありません。私は 'COALESCE(m1.userID、m2.userID)、m1.menuID、m1.userID desc'の順番を変更します。なぜこれが動作しないのか分かりませんsqlfiddleでは、それは本当にうまく私のSQL Serverで動作します。ありがとうございますhttp://sqlfiddle.com/#!6/64ed35/2 –

0

これを確認してください。注文はちょっと混乱していますが、これで目的の結果が得られます。

SELECT * FROM menu_user mu 
ORDER BY mu.menuID, 
CASE WHEN mu.userID IS NULL THEN mu.menuID END 
+0

最初に 'menuID'で注文しますが、まず' userID'が必要ですが、あなたの答えに感謝します。 –

-2

この文字列で検索してください:

SELECT * 
FROM menu_user mu 
WHERE userID IS NOT NULL 
ORDER BY mu.menuID 
+0

クエリフィルタuserID = nullレコード。しかし、質問では、nullレコードも選択する必要があることが明確に定義されていますが、珍しい順に並べ替えられます – Progressive

関連する問題