2009-07-17 2 views
0

У меня есть две таблицы, каждая из которых имеет три столбца с булевым (ms-access «Да/Нет»).Присоединиться к нескольким булевым объектам

Таблица 1: A1, B1, C1-

Таблица 2: А2, В2, С2

Я хотел бы строки из таблицы 2, данные конкретной строки из таблицы 1, которые удовлетворяют следующим условиям:

Если 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) 

Пример Два

  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 вы спрашиваете, просто логическое выражение проблемы. Я предполагаю, что у вас есть еще один столбец в этих таблицах, позволяет объединить строки в t1 до t2, но после ваших примеров (где Существует только одна строка в t1), вы можете сделать это, как:

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) 
; 

Теперь я вижу не-абстрактный ответ, который вы разместили выше. Исходя из этого, в вашем SQL есть некоторые проблемы. Во-первых, вы должны выражать только условия в своих предложениях JOIN, которые связывают таблицу vw_fbScheduleFull с таблицей fbDivision (т. Е. Отношение внешнего/первичного ключа); все материалы LowerDivision/UpperDivision/SeniorDivision должны быть в предложении WHERE.

Во-вторых, вы игнорируете приоритет оператора операторов AND и OR - вы хотите заключить каждую из * разделов пар в пределах parens, чтобы избежать нежелательных эффектов.

Не зная полную схему таблиц, я бы предположил, что требуемая версия этого запроса будет выглядеть примерно так:

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 
; 

Looking еще раз, я понимаю, что ваш «fbDivision.DivisionName = ?» вероятно, уменьшает количество строк в этой таблице до одного и что между этими двумя таблицами не существует формальной связи PK/FK. В этом случае вы должны отказаться от номенклатуры INNER JOIN в предложении FROM и просто перечислить две таблицы; Я обновил свой пример.

+0

+ 1 для упрощенного предложения where. –

+0

Он выглядит как работающий после того, как я создал запрос, используя синтаксис «ИЛИ НЕ». Моя среда IDE (Visual Studio Express) часто реорганизует мой SQL, включая очистку парнов (как в этом случае), или чаще всего добавляющую целую кучу непечатаемых. Я пробовал много способов, не связанных с 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 не включать псевдонимы? –

Смежные вопросы