2017-11-15 14 views
0

条件に基づいてこれらのテーブルの1つを選択する方法はありますか?MySqlテーブルを動的に選択する

 
SELECT * FROM 
CASE WHEN (another query which will return integer)>0 THEN products ELSE sub_products END 
LIMIT 0, 25 
+0

この種の問題は、設計が貧弱になることがありますが、一般的には両方のテーブルをLEFT JOINして、どちらがスティックであるかを確認します。また、ORDER BYのないLIMITは無意味であることに注意してください。 – Strawberry

+0

productsとsub_productsには有効なテーブル名が含まれていますか? –

+0

はい、それらは有効なテーブル名であり、LIMIT –

答えて

0

以下のIntResultQueryを変更すると、スカラー値を返すクエリが含まれます。

a.Rsltを、スカラー値を持つ列の名前に変更します。

SELECT * 
FROM (IntResultQuery) A 
LEFT JOIN Products 
on 1=1 and A.Rslt>0 
LEFT JOIN Sub_products 
on 1=1 and A.Rslt<=0 

私はこのデザインは奇妙であることに同意しますが。両方のテーブルから列名を取得するので、必要なものがない可能性があります。

SELECT * 
FROM (IntResultQuery) A 
LEFT JOIN Products 
on A.Rslt > 0 
LEFT JOIN Sub_products 
on A.Rslt <= 0 

この結合アプローチでは、両方のテーブルが同じテーブル構造を持つと仮定しています。テーブルを結合し、データのソースを示す列を作成することによって、クエリからスカラー結果を取り出し、結合されたテーブルから正しい行を選択することができます。

SELECT * 
FROM (SELECT 0 as src, P.* 
     FROM Products P 
     UNION ALL 
     SELECT -1 as src, SP.* 
     FROM Sub_products SP) Z 
CROSS JOIN (IntResultQuery) A 
WHERE Z.src > A.Rslt 

このアプローチでは、2つのテーブルの複数の列が回避されます。テーブルの構造が同一でない場合は問題が発生します。少なくともいくつかの一致があると仮定して、各テーブルから特定の列を指定することができます。一致しない列には結合が残されます。しかし、このタイプの設計は、変更が必要なときにどのテーブルを更新する必要があるかを複雑にするため、データを維持するのが難しくなります。

+0

'1 = 1'を無視してください。それは常に真実ですが、それをクエリから削除することができます。 –

+0

真。それは、私がテーブル間のPK/FK関係に参加していないことを知ったときに私が持っている習慣です。 – xQbert

+0

あなたの努力に感謝します。状況をより明確に説明しましょう。 私は2つのテーブル1. productsと2. sub_productsを持っています。各sub_productsテーブルアイテムには、parentという商品テーブル項目が必要です。バーガー製品には子供用チキンバーガー、ビーフバーガーなどがあるかもしれません。一方、親製品にはペプシのような子供はいません。 私が必要とするのは、特定のIDのsub_productsテーブルから何も持っていない場合、製品が製品テーブルにあることです。 –

関連する問題