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 如何构造使用子查询结果相互比较的MS Access查询_Sql_Ms Access - Fatal编程技术网

Sql 如何构造使用子查询结果相互比较的MS Access查询

Sql 如何构造使用子查询结果相互比较的MS Access查询,sql,ms-access,Sql,Ms Access,使用MS access 2010并将表链接到SQL Server 2005。链接表有5列: PName - STRING OName - STRING FName - STRING Readable - BOOLEAN Editable - BOOLEAN 样本数据: PName FName readable editable UK Case.First_Name 0 0 UK Case.Last

使用MS access 2010并将表链接到SQL Server 2005。链接表有5列:

PName - STRING
OName - STRING
FName - STRING  
Readable - BOOLEAN  
Editable - BOOLEAN  
样本数据:

PName   FName                readable   editable
UK      Case.First_Name         0       0
UK      Case.Last_Name          0       0
UK      Case.Middle_Initial     0       0
UK      Case.Phone_Number       0       0
UK      Case.Username           -1      -1
USA     Case.First_Name         0       0
USA     Case.Last_Name          0       0
USA     Case.Middle_Initial     0       0
USA     Case.Phone_Number       0       0
USA     Case.Username           -1      -1
正在创建一个查询,该查询将按PName返回所有FName的列表,但仅当所有PName的可读值不同或所有PName的可编辑值不同时才显示FName

示例输出:

                      UK           USA
                   Edit|Read    EDIT|Read
Case.First_Name    T   |  T       F | T
Case.UserName      F   |  F       F | T
在上面的“Case.First_Name”由英国编辑,但不由美国编辑,因此我希望看到这一行

Case.UserName在英国不可读,但在美国可读,因此我希望看到这一行

不应输出的内容:

                      UK           USA
                   Edit|Read    EDIT|Read
Case.First_Name    T   |  T       T | T
Case.UserName      F   |  F       F | F
上述两行对英国和美国都具有相同的可读性和可编辑性权限,因此我不想看到这些行

下面的查询将获取所需的原始数据,然后将其转换为数据透视表:

SELECT PName, FName, Readable, Editable
FROM ProfileFLS
WHERE PName Like "U*";
然后使用If语句将其导出到excel

请注意,配置文件的数量是动态的

谢谢你的帮助

最新SQL:

SQL如下所示,我还尝试将=“True”更改为0


您可以使用MS Access向导创建交叉表查询,也可以使用PIVOT创建SQL直通查询,让SQL Server进行处理

编辑:根据修改后的问题添加以下内容

您可能不需要使用交叉表就可以逃脱。这取决于您的查询需要有多灵活,或者您是否可以动态构造查询。对于上述英国/美国示例,您可以使用:

SELECT dbo_ProfileFLS.FName,
       dbo_ProfileFLS.Readable AS [UK Read], 
       dbo_ProfileFLS.Editable AS [UK Edit],
       dbo_ProfileFLS_1.Readable AS [USA Read],
       dbo_ProfileFLS_1.Editable AS [USA Edit]
FROM   dbo_ProfileFLS
INNER JOIN dbo_ProfileFLS AS dbo_ProfileFLS_1
ON     dbo_ProfileFLS.FName = dbo_ProfileFLS_1.FName
WHERE  dbo_ProfileFLS.PName="UK"
  AND  dbo_ProfileFLS_1.PName="USA" 
  AND  (dbo_ProfileFLS.Readable<>[dbo_ProfileFLS_1].[Readable]
       OR dbo_ProfileFLS.Editable<>[dbo_ProfileFLS_1].[Editable]);
当然,这个查询获取完整的表。要仅获取正确的值,您需要使用第一个查询的变体作为筛选器:

SELECT dbo_ProfileFLS.ID AS UK_ID,
       dbo_ProfileFLS_1.ID AS USA_ID
FROM   dbo_ProfileFLS
INNER JOIN dbo_ProfileFLS AS dbo_ProfileFLS_1 
ON     dbo_ProfileFLS.FName = dbo_ProfileFLS_1.FName
WHERE  dbo_ProfileFLS.PName="UK"
  AND  dbo_ProfileFLS_1.PName="USA" 
  AND  (dbo_ProfileFLS.Readable<>[dbo_ProfileFLS_1].[Readable]
       OR dbo_ProfileFLS.Editable<>[dbo_ProfileFLS_1].[Editable]);

谢谢你编辑你的问题。现在情况清楚多了

让我们从调整示例数据开始,以便获得一些实际结果

PName   FName               readable    editable
UK      Case.First_Name     0           -1
UK      Case.Last_Name      0           0
UK      Case.Middle_Initial 0           0
UK      Case.Phone_Number   0           0
UK      Case.Username       -1          -1
USA     Case.First_Name     0           0
USA     Case.Last_Name      0           0
USA     Case.Middle_Initial -1          0
USA     Case.Phone_Number   0           0
USA     Case.Username       -1          -1
Canada  Case.First_Name     0           0
Canada  Case.Last_Name      0           -1
Canada  Case.Middle_Initial 0           0
Canada  Case.Phone_Number   0           0
Canada  Case.Username       0           0

现在考虑下面的查询。它是一个自联接,在[FName]上查找匹配项,在[readable]或[editable]上查找不匹配项:

SELECT p1.FName, 
    p1.PName AS PName1, p1.readable AS read1, p1.editable AS edit1,
    p2.PName AS PName2, p2.readable AS read2, p2.editable AS edit2
FROM permissionsTbl p1 INNER JOIN permissionsTbl p2
    ON p1.FName=p2.FName 
        AND (p1.readable<>p2.readable OR p1.editable<>p2.editable)
ORDER BY 1, 2 ;
并向我们展示了读取或编辑权限不匹配的每种情况

现在我们将对其进行调整,以提供出现在上述列表中的[FName]值的不同列表

SELECT DISTINCT p1.FName 
FROM permissionsTbl p1 INNER JOIN permissionsTbl p2
    ON p1.FName=p2.FName 
        AND (p1.readable<>p2.readable OR p1.editable<>p2.editable) ;

…并可用于为您的下游流程提供信息。

对不起,我很难理解您要实现的目标。请编辑您的问题,包括链接表中的一些有代表性的示例数据,以及哪些行应该和不应该返回的一些示例。(您当前的“示例输出”看起来像是在尝试返回英国和美国具有相同名称的城市的行,但我不相信这是真的。)此外,请澄清哪些字段并提供一些示例数据。看起来可读/可编辑的是布尔值,但不清楚其余的是什么。另外,输出中的城市和名称是什么?非常感谢您的回答,当尝试交叉表查询时,它告诉我只能有1个值,但是我想要两个值,一个用于可读,一个用于可编辑。在将布尔可编辑和可读字段转换为可以求和的内容时,我也遇到了问题,我尝试了IIF语句choose and switch。SQL代码更新问题非常感谢您的帮助,非常感谢。我会继续玩这个。我应该早点说,但谢谢你加入。我感谢你的贡献。你好,汉斯。谢谢你的客气话。自从加入以来,我学到了很多东西,其中很多是从你那里学到的。@Gord Thompson-非常感谢你的帮助,非常感谢。我们会继续玩这个。
PName   FName               readable    editable
UK      Case.First_Name     0           -1
UK      Case.Last_Name      0           0
UK      Case.Middle_Initial 0           0
UK      Case.Phone_Number   0           0
UK      Case.Username       -1          -1
USA     Case.First_Name     0           0
USA     Case.Last_Name      0           0
USA     Case.Middle_Initial -1          0
USA     Case.Phone_Number   0           0
USA     Case.Username       -1          -1
Canada  Case.First_Name     0           0
Canada  Case.Last_Name      0           -1
Canada  Case.Middle_Initial 0           0
Canada  Case.Phone_Number   0           0
Canada  Case.Username       0           0
SELECT p1.FName, 
    p1.PName AS PName1, p1.readable AS read1, p1.editable AS edit1,
    p2.PName AS PName2, p2.readable AS read2, p2.editable AS edit2
FROM permissionsTbl p1 INNER JOIN permissionsTbl p2
    ON p1.FName=p2.FName 
        AND (p1.readable<>p2.readable OR p1.editable<>p2.editable)
ORDER BY 1, 2 ;
FName               PName1  read1   edit1   PName2  read2   edit2
Case.First_Name     Canada  0       0       UK      0       -1
Case.First_Name     UK      0       -1      Canada  0       0
Case.First_Name     UK      0       -1      USA     0       0
Case.First_Name     USA     0       0       UK      0       -1
Case.Last_Name      Canada  0       -1      USA     0       0
Case.Last_Name      Canada  0       -1      UK      0       0
Case.Last_Name      UK      0       0       Canada  0       -1
Case.Last_Name      USA     0       0       Canada  0       -1
Case.Middle_Initial Canada  0       0       USA     -1      0
Case.Middle_Initial UK      0       0       USA     -1      0
Case.Middle_Initial USA     -1      0       UK      0       0
Case.Middle_Initial USA     -1      0       Canada  0       0
Case.Username       Canada  0       0       USA     -1      -1
Case.Username       Canada  0       0       UK      -1      -1
Case.Username       UK      -1      -1      Canada  0       0
Case.Username       USA     -1      -1      Canada  0       0
SELECT DISTINCT p1.FName 
FROM permissionsTbl p1 INNER JOIN permissionsTbl p2
    ON p1.FName=p2.FName 
        AND (p1.readable<>p2.readable OR p1.editable<>p2.editable) ;
SELECT * FROM permissionsTbl
WHERE FName IN
(
    SELECT DISTINCT p1.FName 
    FROM permissionsTbl p1 INNER JOIN permissionsTbl p2
        ON p1.FName=p2.FName 
            AND (p1.readable<>p2.readable OR p1.editable<>p2.editable)
) ;
PName   FName               readable    editable
UK      Case.First_Name     0           -1
UK      Case.Last_Name      0           0
UK      Case.Middle_Initial 0           0
UK      Case.Username       -1          -1
USA     Case.First_Name     0           0
USA     Case.Last_Name      0           0
USA     Case.Middle_Initial -1          0
USA     Case.Username       -1          -1
Canada  Case.First_Name     0           0
Canada  Case.Last_Name      0           -1
Canada  Case.Middle_Initial 0           0
Canada  Case.Username       0           0