3

3このタイプのクエリも可能かどうか疑問に思っていました。もしそうなら、助けていただければ幸いです。

    SELECT 

        field1,
        field2,
        field3

    FROM maintable

    WHERE maintable.field1 = passed_in_parameter


    IF (maintable.field2 = 1) THEN
            //do anything like joins
        INNER JOIN widgettable on widgettable.widgetid = field3

    ELSEIF (maintable.field2 = 2) THEN
            //do anything like joins
        INNER JOIN gizmottable on gizmottable.gizmoid = field3

    END IF

私がやろうとしていることが理にかなっていることを願っています。要約すると、元の選択のフィールド値に基づいて、さまざまなテーブルを結合する必要があります。

4

3 に答える 3

4

zerkms が示唆したように、それらの両方を外部結合のままにすることができます。以下が機能するかどうかを確認してください

select mt.field1,
    mt.field2,
    mt.field3,
    CASE mt.field2 WHEN 1 THEN wt.widgetname WHEN 2 THEN gt.gizmoname END AS name 
from maintable mt
  left join widgettable wt
    on wt.widgetid = mt.field3
  left join gizmotable gt
    on gt.gizmoid = mt.field3
where mt.field1 = 'param'
   and ((mt.field2 = 1 and wt.widgetid is not null)
       or (mt.field2 = 2 and gt.gizmoid is not null))
于 2012-04-06T04:03:26.820 に答える
1
SELECT 
    maintable.field1,
    maintable.field2,
    maintable.field3,
    CASE maintable.field2
    WHEN 1 THEN widgettable.widget_name
    WHEN 2 THEN gizmotable.gizmo_name
    END AS consolidated_name
FROM      maintable
LEFT JOIN widgettable ON widgettable.widgetid = maintable.field3
LEFT JOIN gizmottable ON gizmottable.gizmoid  = maintable.field3
WHERE     maintable.field1 = 'passed in parameter'
于 2012-04-06T04:02:05.003 に答える
1

結合されたテーブルからのデータを表示することを指定していないことを除けば、これは UNION クエリに少し似ています。つまり、内部結合は単純な存在チェックです。結合されたテーブルに、メイン テーブルの行と一致する行があることを確認します。結合されたテーブルからいくつかの列が必要であると仮定するという「根本的な」手順を実行しました。全体的な効果を大きく変えることなく、これらの結合された列を省略できます。この UNION クエリは、WidgetTable と GizmotTable から必要な列が十分に類似していることを前提としています。次に、次のように記述できます。

SELECT m.field1,
       m.field2,
       m.field3,
       w.column1,
       w.column3
  FROM maintable   AS m
  JOIN widgettable AS w ON w.widgetid = m.field3
 WHERE m.field1 = passed_in_parameter
   AND m.field2 = 1

UNION

SELECT m.field1,
       m.field2,
       m.field3,
       g.attribute23,
       g.attribute19
  FROM maintable   AS m
  JOIN gizmottable AS g ON g.gizmoid = m.field3
 WHERE m.field1 = passed_in_parameter
   AND m.field2 = 2

あなたが探しているものの直接の類似物は次のとおりです。

SELECT m.field1, m.field2, m.field3,
  FROM maintable   AS m
  JOIN widgettable AS w ON w.widgetid = m.field3
 WHERE m.field1 = passed_in_parameter
   AND m.field2 = 1
UNION
SELECT m.field1, m.field2, m.field3,
  FROM maintable   AS m
  JOIN gizmottable AS g ON g.gizmoid = m.field3
 WHERE m.field1 = passed_in_parameter
   AND m.field2 = 2
于 2012-04-06T04:03:40.460 に答える