2017-12-21 5 views
1

このクエリを実行しようとすると、以下のエラーが表示されます。サブクエリが1より大きい値を返しましたSQLエラー

私がしようとしているのは、ユーザーIDがサプライヤ(from_user_id)に属していて、SUPPLIERの説明を表示していない場合は、CUSTOMERの説明を表示することです。

Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.

SELECT status_history.date, 
     status_history.doc_type, 
     status_history.document_id, 
     user.email, 
     doctypes.description, 
     orders.order_no 
     document_no, 
     (SELECT CASE 
       WHEN status_history.id = orders.from_id THEN 
       old_status.supplier_description 
       ELSE old_status.customer_description 
       END AS old_status_desc 
     FROM status_history 
     WHERE status_history.link_number = 821 
       AND status_history.id = user.id 
       AND status_history.doc_type = 
        doctypes.doc_type 
       AND status_history.old_status_id = old_status.status_id 
       AND status_history.new_status_id = new_status.status_id) AS 
     old_status_desc, 
     (SELECT CASE 
       WHEN status_history.id = orders.from_id THEN 
       new_status.supplier_description 
       ELSE new_status.customer_description 
       END AS new_status_desc 
     FROM status_history 
     WHERE status_history.link_number = 821 
       AND status_history.id = user.id 
       AND status_history.doc_type = 
        doctypes.doc_type 
       AND status_history.old_status_id = old_status.status_id 
       AND status_history.new_status_id = new_status.status_id) AS 
     new_status_desc 
FROM status_history, 
     user, 
     doctypes, 
     qc_status old_status, 
     qc_status new_status, 
     orders 
WHERE status_history.link_number = 821 
     AND status_history.id = user.id 
     AND status_history.doc_type = doctypes.doc_type 
     AND status_history.old_status_id = old_status.status_id 
     AND status_history.new_status_id = new_status.status_id 
     AND orders.quote_id = status_history.document_id 
     AND status_history.doc_type = 1 
ORDER BY status_history.date, 
      status_history.doc_type 

EDIT:このクエリの

結果を注文するための異なるステータスのモーダルを表示するために使用されます。つまり、「新規」→「保存済み」のような注文が表示されます。

私はサプライヤーとして2種類のユーザーを持っています。サプライヤーは、サプライヤーのステータス説明を見ることができ、その逆もあります。

例として、サプライヤとして注文のステータスを表示すると、Saved - > Sentが表示され、顧客として表示した場合はSaved - > Receivedと表示されます。

注文が作成されるたびに、SUPPLIERとCUSTOMERのレコードが1つずつ、status_historyテーブルにレコードが挿入されます。次に、order.from_user_idに対してユーザーIDを使用して、正しい記述を取得するユーザーのタイプを判別します。あなたはサブクエリを取り除き、代わりにこのようなCTEを使用し得ることができます

+2

エラーメッセージをクリアできませんでした。あなたが持っているそれらの 'CASE'サブクエリは、少なくともいくつかの例では、レコード以上のものを返しています。また、古い暗黙的な結合構文を使用しているため、クエリが何をしているのかをさらに見やすくすることができます。 –

+0

@TimBiegeleisen私は 'CASE'サブクエリを使わずにこのクエリを実行する方法を試しています。単純に結合を使用することはできますが、条件もありますか?今質問を編集します。 –

答えて

1

WITH CTE 
AS 
(
    SELECT status_history.id, CASE 
      WHEN status_history.id = orders.from_id THEN 
      old_status.supplier_description 
      ELSE old_status.customer_description 
     END AS old_status_desc, 
     CASE 
      WHEN status_history.id = orders.from_id THEN 
      new_status.supplier_description 
      ELSE new_status.customer_description 
     END AS new_status_desc 
    FROM status_history 
    WHERE status_history.link_number = 821 
     AND status_history.id = user.id 
     AND status_history.doc_type = doctypes.doc_type 
     AND status_history.old_status_id = old_status.status_id 
     AND status_history.new_status_id = new_status.status_id 
) 
SELECT status_history.date, 
     status_history.doc_type, 
     status_history.document_id, 
     user.email, 
     doctypes.description, 
     orders.order_no 
     document_no, 
     c.old_status_desc, 
     c.new_status_desc 
FROM status_history 
INNER JOIN user ON status_history.id = user.id 
INNER JOIN doctypes status_history.doc_type = doctypes.doc_type 
INNER JOIN qc_status old_status ON status_history.old_status_id = old_status.status_id 
INNER JOIN qc_status new_status ON status_history.new_status_id = new_status.status_id 
INNER JOIN orders ON orders.quote_id = status_history.document_id 
INNER JOIN CTE AS c ON status_history.id = c.id 
WHERE status_history.link_number = 821 AND status_history.doc_type = 1 
ORDER BY status_history.date, 
      status_history.doc_type; 

これは、エラーメッセージを削除しますが、行ごとのステータスを重複しています。この場合、group byを使用して集計関数を使用して、各行に対して1つのステータスのみを取得する必要があります。

関連する問題