2017-02-21 6 views
1

複数の値を持つCASEはどのように使用できますか?ここに私のクエリです:条件を更新したSQL Server

UPDATE car_availability 
SET availability_status = CASE 
          WHEN car_no = (SELECT A.car_no 
              FROM car_maintenance A 
              WHERE A.car_no = car_no 
               AND A.Start_Date = (SELECT DATEADD(dd, DATEDIFF(dd, 0, GETDATE()), 0))) 
           THEN 'For Maintenance' 
           ELSE 'Good' 
          END 

と私は、サブクエリが1つの以上の値を返し、エラー

を取得しています。 =、!=、<、< =、>、> =、またはサブクエリが式として使用されている場合は、これは許可されません。 ステートメントが終了しました。

car_maintenanceテーブルでは、私はそれがメンテナンスのための車のセットを持っている間にcar_availabilityテーブルに私はすべての車を持っています。 car_maintenanceの下にあるすべての車のavailability_statusを「保守のために」設定したいと思います。どうやってやるの?

car_availabilityの私の列はcar_nocar_availabilityです。または、IF ELSEを使用してこれを行うことはできますか?前もって感謝します。 car_maintenance表について

、列はあなたが(=の代わりに)IN句を使用するコールド

car_no, maintenance_category, start_date_of_maintenance, end_date_of_maintenance 

答えて

1

ある

UPDATE car_availability 
    SET availability_status = CASE WHEN car_no IN (SELECT A.car_no FROM car_maintenance A 
          WHERE A.car_no = car_no and A.Start_Date = 
          (SELECT DATEADD(dd, DATEDIFF(dd, 0, GETDATE()), 0))) 
     THEN 'For Maintenance' 
     ELSE 'Good' 
     END 
+0

ありがとうございます。 availability_statusの下に複数のCASEを持つことはできますか? –

+0

可用性ステータスに異なる値を割り当てることができるので、条件が複数ある場合があります。 – scaisEdge

2

使用join。私は、これはあなたが欲しいものだと思う:

UPDATE ca 
    SET availability_status = (CASE WHEN cm.car_no IS NOT NULL 
            THEN 'For Maintenance' 
            ELSE 'Good' 
           END) 
    FROM car_availability ca LEFT JOIN 
     car_maintenance cm 
     ON cm.car_no = ca.car_no AND 
      cm.Start_Date = CAST(GETDATE() as DATE); 
+0

UPDATEステートメントのFROM句にサブクエリのソースまたは結合を含めることができません。 '私はSQL Server 2016を使用していますが、どのバージョンのものを使用しているのですか? –

+0

@RobertJohnMartin。 。 。それは私にとってSQL Serverのエラーのようには聞こえません。 –

0

私はあなたのサブクエリは、車の番号のDISTINCT集合以外のものを返しているため、エラーが実際に発生していると信じています。ただ、「DISTINCT」のキーワードを単に追加するだけでは、ここで適切な結果が得られるかどうかはわかりません。

このような場合、サブクエリを引き出して慎重に見てください。これを素早く見て、私はフィルタを見ます: "WHERE A.car_no = car_no"、私はすぐに理解しません。私はそのフィルタリングが今私たちにメンテナンスの車だけを与えてくれる理由を理解しようとしています(私は日付のものを見ていますが、メンテナンステーブルの内容を知らずに、このサブクエリは、メンテナンステーブルの正確な内容に依存します。

私はあなたがサブクエリのために欲しいのは、car_maintenanceテーブルのデータを使って、メンテナンス中の車を正しく選択する式だと考えています。このテーブルにあるものを慎重に検討することでこれを行うことができる可能性があります。テーブルにメンテナンスされていたすべての車が含まれている場合、CompletionDateを示すフィールドはありますか?メンテナンス表にメンテナンス中の開始日と終了日の両方が表示されている場合は、金色になります。いくつかの日付指向のステートメントを行う必要がありますが、どの車が現在メンテナンスされているかを分離することができます。 CompletionDate = NULLのレコードは、メンテナンス中の車である可能性もあります。ここでも、car_maintenanceテーブルについてもっと知る必要があります。

一方、car_maintenanceテーブルは、現在メンテナンス中の車のcar_numberテーブルのみを保持するように設計されています。

私たちは本当にそれを知りません。したがって、car_maintenanceテーブルの内容を記入してください。 UPDATEクエリが "car_availability"の適切なSETを引き起こすかどうかを確認するために、それについてもっと知る必要があります。

私は、車のリストを得ることを試みている「ブロック」としてSub Queryのコード領域を見ることができると思う傾向があります。それはすべての車ではなく、ちょうどいくつかの車です。現在メンテナンス中のもの。そうすれば、Sub Queryのコードを単独で実行するとき(私はこのようなことをしても、同じSQLウィンドウで実行した後、カットアンドペーストして最終的にテストコードを削除します)、それを見ることができます「これはメンテナンスにおける現在の車のセットですか?」コードが満足したら、現在メンテナンス中の車だけが常に得られます。コードに配置するのは問題ありません。

幸運。