2

問題は以下の通りです。3つのカテゴリ(category_idで定義)のいずれかに分類できる製品があります。各カテゴリテーブルには、製品テーブルのcategory_idに関連するcategory_idフィールドがあります。だから私は3つのケースがあります。product.category_idが表1にあるかどうかを確認しています。はいの場合、私はいくつかの値を取ります。そうでない場合は、残っているテーブルをチェックインします。ELSEセクションに何を書くことができますか?誰かが私のクエリを修正できますか?

CASE
    WHEN IF EXISTS(SELECT * FROM table1 WHERE category_id='category_id') THEN SELECT type_id FROM table1 WHERE category_id='category_id';
    WHEN IF EXISTS(SELECT * FROM table2 WHERE category_id='category_id') THEN SELECT value_id FROM table2 WHERE category_id='category_id';
    WHEN IF EXISTS(SELECT * FROM table3 WHERE category_id='category_id') THEN SELECT group_id FROM table3 WHERE category_id='category_id';
ELSE "dont know what here";
END;
4

6 に答える 6

2

にはelse、たとえば、デフォルト値として必要なものを入力しますnull

coalesce結果の各製品に対していくつかのサブクエリを作成する代わりに、3 つの左結合を作成し、最初の既存の値を取得するために使用する方がはるかに効率的だと思います。例:

select coalesce(t1.type_id, t2.value_id, t3.group_id)
from product p
left join table1 t1 on t1.category_id = p.category_id
left join table2 t2 on t2.category_id = p.category_id
left join table3 t3 on t3.category_id = p.category_id
于 2010-06-16T11:43:25.757 に答える
1

SELECT CompanyName, 
    Fax, 
    CASE WHEN IF(Fax='', 'No Fax', 'Got Fax')='No Fax' THEN NULL 
         ELSE IF(Fax='', 'No Fax', 'Got Fax') 
    END AS Note
FROM Customers;
于 2012-11-08T06:24:25.870 に答える
0

またはこのようなもの

CASE
    WHEN IF EXISTS(SELECT * FROM table1 WHERE category_id='category_id') THEN SELECT type_id FROM table1 WHERE category_id='category_id';
    WHEN IF EXISTS(SELECT * FROM table2 WHERE category_id='category_id') THEN SELECT value_id FROM table2 WHERE category_id='category_id';
ELSE SELECT group_id FROM table3 WHERE category_id='category_id';
于 2010-06-16T11:40:54.937 に答える
0

おそらくこれを含めることができます... SELECT "Unknown type" FROM table1;

于 2010-06-16T11:38:24.567 に答える
0

何もする必要がない場合は、ELSE を使用する必要はありません。

于 2010-06-16T11:39:13.863 に答える
0

Guffaの答えに加えて、別のアプローチがあります-@category_idが

SET @category_id = 'some_category_id_value'

それから

SELECT t1.type_id
WHERE category_id = @category_id
UNION ALL
SELECT t2.value_id
WHERE category_id = @category_id
UNION ALL
SELECT t3.group_id
WHERE category_id = @category_id

あなたが求めるものを返す必要があります(パフォーマンスも悪くありません)。

複数のテーブルに確実category_idにある場合は、複数のレコードを取得します (結果の数を 1 に制限することで、それを回避できます。ユニオン全体をサブクエリにして順序付けする必要があるかもしれませんが、よくわかりません。相談してください。ドキュメント)

ただし、あなたの質問は、テーブルの設計に問題があるようです

  • なぜ 1 つではなく 3 つのカテゴリ テーブルを保持するのですか?
  • type_id、value_id、および group_id の関係は何ですか?また、それらが同じものであるかのように選択することが理にかなっているのはなぜですか (各テーブル/列の意味/セマンティクスは何ですか)?
  • 1 つの製品に対応する複数のテーブルにエントリがないことをどのように保証しますか (また、他のビジネス ルールを実装する可能性があります)。

これらの質問には有効な答えがあるかもしれませんが、知っておく必要があります:)

于 2010-06-16T12:00:11.583 に答える