Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在多个布尔上连接_Sql_Ms Access_Join - Fatal编程技术网

Sql 在多个布尔上连接

Sql 在多个布尔上连接,sql,ms-access,join,Sql,Ms Access,Join,我有两个表,每个表有三个布尔(ms access“是/否”)列 表1:A1、B1、C1 表2:A2、B2、C2 我希望表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

我有两个表,每个表有三个布尔(ms access“是/否”)列

表1:A1、B1、C1

表2:A2、B2、C2

我希望表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_fbSchedule
      Full 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

这不是一个真正的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中存在一些问题。首先,您应该只在连接子句中表示将vw_fbScheduleFull表与fbDivision表关联的条件(即外键/主键关系);所有低分/高分/高分的内容都应该在WHERE子句中

其次,您忽略了AND和OR运算符的运算符优先级-您希望将每个*除法对都包含在paren中,以避免不必要的影响

由于不知道表的完整模式,我猜想此查询的正确版本如下所示:

  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 
;
选择vw_fbScheduleFull.LocationName
,vw_fbScheduleFull.FieldName
,vw_fbScheduleFull.Description
,vw_fbScheduleFull.StartTime
,vw_fbScheduleFull.EndTime
,vw_fbScheduleFull.LowerDivision
,vw_fbScheduleFull.UpperDivision
,vw_fbScheduleFull.Senior分部
来自vw_fbScheduleFull
,FBI分部
其中vw_fbScheduleFull.PracticeDate=?
并且vw_fbScheduleFull.Locked为空
和fbDivision.DivisionName=?
和(vw_fbScheduleFull.LowerDivision=1或fbDivision.LowerDivision 1)
和(vw_fbScheduleFull.UpperDivision=1或fbDivision.UpperDivision 1)
和(vw_fbScheduleFull.SeniorDivision=1或fbDivision.SeniorDivision 1)
按vw_fbScheduleFull.LocationName订购
,vw_fbScheduleFull.FieldName
,vw_fbScheduleFull.StartTime
;

再看一次,我意识到您的“fbDivision.DivisionName=?”可能正在将该表中的行数减少到一行,并且这两个表之间没有正式的PK/FK关系。在这种情况下,您应该省去FROM子句中的内部联接术语,只列出这两个表;我已经更新了我的示例。

你问的其实不是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中存在一些问题。首先,您应该只在连接子句中表示将vw_fbScheduleFull表与fbDivision表关联的条件(即外键/主键关系);所有低分/高分/高分的内容都应该在WHERE子句中

其次,您忽略了AND和OR运算符的运算符优先级-您希望将每个*除法对都包含在paren中,以避免不必要的影响

由于不知道表的完整模式,我猜想此查询的正确版本如下所示:

  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 
;
选择vw_fbScheduleFull.LocationName
,vw_fbScheduleFull.FieldName
,vw_fbScheduleFull.Description
,vw_fbScheduleFull.StartTime
,vw_fbScheduleFull.EndTime
,vw_fbScheduleFull.LowerDivision
,vw_fbScheduleFull.UpperDivision
,vw_fbScheduleFull.Senior分部
来自vw_fbScheduleFull
,FBI分部
其中vw_fbScheduleFull.PracticeDate=?
并且vw_fbScheduleFull.Locked为空
和fbDivision.DivisionName=?
和(vw_fbScheduleFull.LowerDivision=1或fbDivision.LowerDivision 1)
和(vw_fbScheduleFull.UpperDivision=1或fbDivision.UpperDivision 1)
和(vw_fbScheduleFull.SeniorDivision=1或fbDivision.SeniorDivision 1)
按vw_fbScheduleFull.LocationName订购
,vw_fbScheduleFull.FieldName
,vw_fbScheduleFull.StartTime
;

再看一次,我意识到您的“fbDivision.DivisionName=?”可能正在将该表中的行数减少到一行,并且这两个表之间没有正式的PK/FK关系。在这种情况下,您应该省去FROM子句中的内部联接术语,只列出这两个表;我更新了我的例子。

史蒂夫·布罗伯格的回答是正确的,很好;我只想补充一点,别名可以让查询变得更容易:

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 
;
选择f.LocationName
,f.FieldName
,f.说明
,f.StartTime
,f.EndTime
,f.LowerDivision
,f.上师
,f.Senior分部
来自vw_FBSchedulef
,FBD分部
其中f.PracticeDate=?
f.Locked为空
和d.name=?
和(f.LowerDivision=1或d.LowerDivision 1)
和(f.UpperDivision=1或d.UpperDivision 1)
和(f.SeniorDivision=1或d.SeniorDivision 1)
按f.LocationName订购
,f.FieldName
,f.StartTime
;

史蒂夫·布罗伯格的回答是正确的,很好;我只想补充一点,别名可以让查询变得更容易:

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 
;
选择f.LocationName
,f.FieldName
,f.说明
,f.StartTime
,f.EndTime
,f.LowerDivisi