Sql 如何构造使用子查询结果相互比较的MS Access查询
使用MS access 2010并将表链接到SQL Server 2005。链接表有5列: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
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