2009-07-17 3 views
0

두 개의 테이블이 있으며 각 테이블에는 3 개의 부울 (ms 액세스 "예/아니요") 열이 있습니다.여러 개의 부울에 가입

표 1 : A1, B1, C1

표 2 : A2, B2, C2

I 표는 다음 조건을 만족 1 특정 행 주어진 표 2에서 행하고자 :

A1이 참이면 A2가 참인 행만, A1이 거짓이면 A2가 참 또는 거짓 인 행이됩니다. B1이 참이면 B2가 참인 행만, B1이 거짓이면 B2가 참 또는 거짓 인 행이 표시됩니다. C1이 참이면 C2가 참인 행만, C1이 거짓이면 C2가 참 또는 거짓 인 행이됩니다.

  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) 

예제 2

  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에 몇 가지 문제가 있습니다. 우선, vw_fbScheduleFull 테이블과 fbDivision 테이블 (즉, 외부/기본 키 관계)을 관련시키는 JOIN 절의 조건 만 표현해야합니다. 모든 LowerDivision/UpperDivision/SeniorDivision 항목은 WHERE 절에 있어야합니다.

둘째, AND 연산자와 OR 연산자의 연산자 우선 순위를 무시합니다. 원하지 않는 영향을 피하기 위해 * 분할 쌍을 괄호 안에 넣으 려합니다.

이 테이블의 전체 스키마를 몰랐던 나는이 쿼리의 적절한 버전이 같은 것을 볼 것이라고 생각합니다 :

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로 줄어들고 두 테이블간에 공식적인 PK/FK 관계가없는 것입니다. 어떤 경우에는 FROM 절의 INNER JOIN 명명법을 사용하지 말고 두 테이블을 나열해야합니다. 내 예를 업데이트했습니다.

+0

+1 단순화 된 where 절. –

+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에 별칭이 포함되어 있지 않습니까? –