4

MS Access 2010 の複合クエリについてサポートが必要です。

この構造のテーブルが 1 つあります。

ChoirOrder(name, category, day, h_start, h_end, ord);

ここでnamecategoryは の主キーですChoirOrdercategoryフィールドは、AまたはBですY

次の形式でデータを抽出する必要があります。

FullChoirExecution (
  name, 
  cat_a_day, 
  cat_a_h_start, 
  cat_a_h_end, 
  cat_a_order,
  cat_b_day, 
  cat_b_h_start, 
  cat_b_h_end, 
  cat_b_order,
  cat_y_day, 
  cat_y_h_start, 
  cat_y_h_end, 
  cat_y_order
);

(すべての聖歌隊は 1 つの行にのみ表示されname、主キーである必要があります)。

問題は、元のテーブルに合唱団にそのカテゴリの行がない場合に、 、、およびフィールド ( 、またはの場合がある) で取得NULLしたいことです。たとえば、データが次の場合:cat_x_daycat_x_h_startcat_x_h_endcat_x_h_orderxABYChoirOrderChoirOrder

 NAME | CAT |    DAY     | H_START | H_END | ORD 
  C1  |  A  | 04/03/2014 |  09:00  | 10:00 |  1
  C2  |  A  | 04/03/2014 |  10:00  | 11:00 |  2
  C3  |  A  | 04/03/2014 |  11:00  | 12:00 |  3
  C4  |  A  | 04/03/2014 |  12:00  | 13:00 |  4
  C1  |  B  | 05/03/2014 |  14:00  | 15:00 |  1
  C2  |  B  | 05/03/2014 |  15:00  | 16:00 |  2
  C5  |  B  | 05/03/2014 |  16:00  | 17:00 |  3
  C3  |  Y  | 06/03/2014 |  09:00  | 10:00 |  1
  C5  |  Y  | 06/03/2014 |  10:00  | 11:00 |  2
  C6  |  Y  | 06/03/2014 |  11:00  | 12:00 |  3
  C4  |  Y  | 06/03/2014 |  12:00  | 13:00 |  4

結果は次のようになります。

 NAME | CAT_A_DAY  | CAT_A_H_START | CAT_A_H_END | CAT_A_ORDER | CAT_B_DAY  | CAT_B_H_START | CAT_B_H_END | CAT_B_ORDER | CAT_Y_DAY  | CAT_Y_H_START | CAT_Y_H_END | CAT_Y_ORDER |
  C1  | 04/03/2014 |     09:00     |    10:00    |      1      | 05/03/2014 |     14:00     |    15:00    |      1      |            |               |             |             |
  C2  | 04/03/2014 |     10:00     |    11:00    |      2      | 05/03/2014 |     15:00     |    16:00    |      2      |            |               |             |             |
  C3  | 04/03/2014 |     11:00     |    12:00    |      3      |            |               |             |             | 06/03/2014 |     09:00     |    10:00    |      1      |
  C4  | 04/03/2014 |     12:00     |    13:00    |      4      |            |               |             |             | 06/03/2014 |     12:00     |    13:00    |      4      |
  C5  |            |               |             |             | 05/03/2014 |     16:00     |    17:00    |      3      | 06/03/2014 |     10:00     |    11:00    |      2      |
  C6  |            |               |             |             |            |               |             |             | 06/03/2014 |     11:00     |    12:00    |      3      |

(合唱団にはカテゴリがC1の行がないため、フィールド、、およびが に設定されます。他の合唱団についても同様です)。ChoirOrderYCAT_Y_DAYCAT_Y_H_STARTCAT_Y_H_ENDCAT_Y_ORDERNULL

次のコードを使用して、2 つのテーブルの完全外部結合を準備しました。Aカテゴリ内のすべての聖歌隊と、そのカテゴリの行しかないすべての聖歌隊を抽出することで機能しBます (Access 2010 は完全な外部結合をサポートしていないため、LEFT 結合 UNION RIGHT 結合を使用します)。

SELECT 
  B.[name]      AS [name], 
  A.[day]       AS [cat_a_day], 
  A.[h_start]   AS [cat_a_h_start], 
  A.[h_end]     AS [cat_a_h_end], 
  A.[ord]       AS [cat_a_order],
  B.[day]       AS [cat_b_day], 
  B.[h_start]   AS [cat_b_h_start], 
  B.[h_end]     AS [cat_b_h_end], 
  B.[ord]       AS [cat_b_order]

FROM 
  [ChoirOrder] AS A
  LEFT OUTER JOIN 
    [ChoirOrder] AS B 
  ON 
        (A.[name] = B.[name])
    AND (A.[category]='A' AND B.[category]='B')

UNION 

SELECT 
  B.[name]      AS [name], 
  A.[day]       AS [cat_a_day], 
  A.[h_start]   AS [cat_a_h_start], 
  A.[h_end]     AS [cat_a_h_end], 
  A.[ord]       AS [cat_a_order],
  B.[day]       AS [cat_b_day], 
  B.[h_start]   AS [cat_b_h_start], 
  B.[h_end]     AS [cat_b_h_end], 
  B.[ord]       AS [cat_b_order]

FROM 
  [ChoirOrder] AS A
  RIGHT OUTER JOIN 
    [ChoirOrder] AS B 
  ON 
        (A.[name] = B.[name])
    AND (A.[category]='A' AND B.[category]='B')

WHERE A.[category] IS NULL;

ただし、このクエリは意図した結果の一部しか抽出しません。Yカテゴリも含めるには、それを組み合わせるか、完全に書き直す必要があります。

入れてもいいと思った

  NULL  AS [cat_y_day], 
  NULL  AS [cat_y_h_start], 
  NULL  AS [cat_y_h_end], 
  NULL  AS [cat_y_order]

クエリで、しかし私はそれを機能させることができません。何か案は?

4

1 に答える 1