2009-07-17 14 views
0

私は3つのブール型(msアクセス "はい/いいえ")の列を持つ2つのテーブルを持っています。複数のブール値に結合する

表1:A1、B1、C1

表2:A2、B2、C2

Iは、以下の条件を満足する表1から特定の行所定の表2の行を希望:

A1が真の場合は、A2が真の行のみ、A1が偽の場合、A2が真または偽の行だけです。 B1が真の場合、B2が真である行だけが偽の場合、次にB2が真または偽の行が表示されます。 C1がtrueの場合は、C2が真の行のみ、C1が偽の場合はC2が真または偽の行だけです。

例1

  A, B, C  
Table 1: 0, 1, 0 (selected row) 

Table 2: 1, 0, 0 
     0, 1, 0 (in return set) 
     1, 1, 0 (in return set) 
     0, 0, 1 
     1, 0, 1 
     0, 1, 1 (in return set) 
     1, 1, 1 (in return set) 

例二

  A, B, C  
Table 1: 0, 0, 1 (selected row) 

Table 2: 1, 0, 0 
     0, 1, 0 
     1, 1, 0 
     0, 0, 1 (in return set) 
     1, 0, 1 (in return set) 
     0, 1, 1 (in return set) 
     1, 1, 1 (in return set) 

どのように私は最高これを実現することができますか?

例えば、これは動作しません:

SELECT  vw_fbScheduleFull.LocationName, vw_fbScheduleFull.FieldName, vw_fbScheduleFull.Description, vw_fbScheduleFull.StartTime, 
         vw_fbScheduleFull.EndTime, vw_fbScheduleFull.LowerDivision, vw_fbScheduleFull.UpperDivision, vw_fbScheduleFull.SeniorDivision 
FROM   (vw_fbScheduleFull INNER JOIN 
         fbDivision ON vw_fbScheduleFull.LowerDivision = fbDivision.LowerDivision AND fbDivision.LowerDivision = 1 OR 
         vw_fbScheduleFull.UpperDivision = fbDivision.UpperDivision AND fbDivision.UpperDivision = 1 OR 
         vw_fbScheduleFull.SeniorDivision = fbDivision.SeniorDivision AND fbDivision.SeniorDivision = 1) 
WHERE  (vw_fbScheduleFull.PracticeDate = ?) AND (vw_fbScheduleFull.Locked IS NULL) AND (fbDivision.DivisionName = ?) 
ORDER BY vw_fbScheduleFull.LocationName, vw_fbScheduleFull.FieldName, vw_fbScheduleFull.StartTime 
+0

この宿題ですか? – SingleNegationElimination

+0

それは次の関連ウェブサイトであるべきです。 domyhomework.com – Troggy

+0

これは本当です。私は宿題がありません。例を簡略化して申し訳ありません。 – Degan

答えて

3

それは本当にあなたが求めているSQLの問題、ちょうどブール式の問題ではありません。

SELECT t2.A2 
     , t2.B2 
     , t3.C2 
    FROM t1 
     , t2 
    WHERE (t2.A2 OR NOT T1.A1) 
    AND (t2.B2 OR NOT T1.B1) 
    AND (t2.C2 OR NOT T1.C1) 
; 
:私はあなたがT2にT1の行に参加することができますこれらのテーブルの別の列を持っているが、(T1で唯一の1行がある)あなたの例を、以下の、あなたのようにそれを行うことができます仮定します

私はあなたが上に投稿した抽象的な答えを見ています。それに基づいて、あなたのSQLにいくつかの問題があります。 1つは、vw_fbScheduleFullテーブルとfbDivisionテーブルを関連付けるJOIN句の条件(つまり外部キーと主キーの関係)のみを表現する必要があります。 LowerDivision/UpperDivision/SeniorDivisionのすべてがWHERE句に含まれている必要があります。

第2に、AND演算子とOR演算子の演算子の優先順位を無視しています。望ましくない影響を避けるために、*分割の各ペアを括弧で囲む必要があります。テーブルの完全なスキーマを知らない

が、私はこのクエリの適切なバージョンは、このようなものになりますよね:1つのより多くの時間を探し

SELECT vw_fbScheduleFull.LocationName 
     , vw_fbScheduleFull.FieldName 
     , vw_fbScheduleFull.Description 
     , vw_fbScheduleFull.StartTime 
     , vw_fbScheduleFull.EndTime 
     , vw_fbScheduleFull.LowerDivision 
     , vw_fbScheduleFull.UpperDivision 
     , vw_fbScheduleFull.SeniorDivision 
    FROM vw_fbScheduleFull 
     , fbDivision 
    WHERE vw_fbScheduleFull.PracticeDate = ? 
    AND vw_fbScheduleFull.Locked IS NULL 
    AND fbDivision.DivisionName = ? 
    AND (vw_fbScheduleFull.LowerDivision = 1 OR fbDivision.LowerDivision <> 1) 
    AND (vw_fbScheduleFull.UpperDivision = 1 OR fbDivision.UpperDivision <> 1) 
    AND (vw_fbScheduleFull.SeniorDivision = 1 OR fbDivision.SeniorDivision <> 1) 
ORDER BY vw_fbScheduleFull.LocationName 
     , vw_fbScheduleFull.FieldName 
     , vw_fbScheduleFull.StartTime 
; 

を、私はあなたの「fbDivision.DivisionName =を実現します? "その表の行数を1に減らし、2つの表の間に正式なPK/FK関係がない可能性があります。その場合は、FROM句のINNER JOIN命名法を省略して、2つのテーブルをリストするだけです。私は私の例を更新しました。

+0

+単純化されたwhere節では1です。 –

+0

「OR NOT」構文を使用してクエリを作成した後で動作するように見えます。私のIDE(Visual Studio Express)では、括弧を拭き取る(この場合)ようにSQLを再編成することがよくあります。 私はこのフィルタリングを達成するために多くのJOIN以外の方法を試しましたが、何とかJOINが必要であると私は確信していました。 ご協力いただきありがとうございます。 – Degan

0

スティーブ・ブロバーの答えは正解です。私はちょうどエイリアスが目にはるかに簡単にクエリを行うことができることを追加したいと思います:

SELECT f.LocationName 
     , f.FieldName 
     , f.Description 
     , f.StartTime 
     , f.EndTime 
     , f.LowerDivision 
     , f.UpperDivision 
     , f.SeniorDivision 
    FROM vw_fbScheduleFull f 
     , fbDivision  d 
    WHERE f.PracticeDate = ? 
    AND f.Locked IS NULL 
    AND d.DivisionName = ? 
    AND (f.LowerDivision = 1 OR d.LowerDivision <> 1) 
    AND (f.UpperDivision = 1 OR d.UpperDivision <> 1) 
    AND (f.SeniorDivision = 1 OR d.SeniorDivision <> 1) 
ORDER BY f.LocationName 
     , f.FieldName 
     , f.StartTime 
; 
+0

これは、Accessを使用していない可能性のある人からの回答ですが、SQLを手作業で書いています。 –

+0

両方のカウントを修正してください。 Access 'SQLにエイリアスが含まれていませんか? –

関連する問題