0

ここで、30 個のテーブルを持つデータベースに依存する検索ページのクエリを作成する必要があります。

私の要件を例で説明します。

テーブル A とテーブル B の間に関係がある -> 1 対多の関係

テーブル A は学生情報用であり、テーブル B はその学生のコースを毎年保存するためのものであるとします。毎年3科目しか履修できないため、構造は次のようになります。

表 A: ID、学生名、電話番号、生年月日 ......

表 B: : ID、StudentID、日付、サブジェクト 1、サブジェクト 2、サブジェクト 3

そのため、学生は年に 3 つの科目を受講できます。X という科目のクエリを作成して、任意の年に 1 回だけ受講するすべての学生を取得したいと考えています。

有効な学生の例:

  StudentID  Sub1  Sub2  Sub3  Year  
  60         Z     (X)    Y      1
  60         L      W     V      2
  60         M      P     Y      3

無効な学生の例:

  StudentID  Sub1  Sub2  Sub3  Year  
  10         Z     (X)    O      1
  10         L      W     V      2
  10         O      P    (x)     3

私の問題が十分に明確であることを願っています

4

2 に答える 2

2

表 2 のサブジェクトごとに 1 つの行を使用した方がよいというコメントに同意します(正規化された構造は、事実上常により優れており、SQL に適しています)

とはいえ、あなたの構造でそれを解決することができます。

SELECT
  studentID
FROM
  table2
WHERE
     sub1 = 'x'
  OR sub2 = 'x'
  OR sub3 = 'x'
GROUP BY
  studentID
HAVING
  COUNT(*) = 1

(これは、学生が同じ学年に同じ科目を 2 回履修できないことを前提としています。)

SQL の種類によっては、WHERE 句を短縮できる場合があります...

WHERE
  'x' IN (sub1, sub2, sub3)

これをサブクエリに入れて、すべての学生の詳細を取得できます...

SELECT
  *
FROM
  table1
INNER JOIN
(
  <put the above query here>
)
  AS lookup
    ON lookup.studentID = table1.studentID

編集

私はあなたのコメントを理解していません。しかし、代替の (そして潜在的により一般化可能な) HAVING 句は..

HAVING
  SUM(CASE WHEN sub1 = 'x' THEN 1 ELSE 0 END +
      CASE WHEN sub2 = 'x' THEN 1 ELSE 0 END +
      CASE WHEN sub3 = 'x' THEN 1 ELSE 0 END)
  = 1
于 2012-10-08T11:26:59.443 に答える
0

これを行う1つの方法..
特定の科目Xについて、すべての学生のループを実行して、彼がこのような科目の有効な学生であるかどうかを確認できます。ループ内:

IF(
(SELECT count(1) from TableB where Sub1 = 'X' and StudentID = 60 ) + 
(SELECT count(1) from TableB where Sub2 = 'X' and StudentID = 60 ) + 
(SELECT count(1) from TableB where Sub3 = 'X'and StudentID = 60 ) ) = 1
BEGIN
    INSERT INTO #ValidStudent(...)
END  

60の代わりにStudentID変数を最後に配置する必要があります。

SELECT * FROM #ValidStudent
于 2012-10-08T11:56:05.847 に答える