从1:N中选择一个不同的值,取决于连接到N的表作为1:1

时间:2016-07-25 21:18:37

标签: sql ms-access

哇,这个标题很糟糕。

情况就是这样......

我有三张桌子。

应用程序:第一个表是应用程序目录,这些应用程序包含应用程序ID,应用程序名称以及其他对此问题不重要的字段。

库存:第二个表是这些应用程序的部署列表。部署包含应用程序名称,应用程序ID,库存ID,部门,设施以及此问题不重要的其他字段。

FRMP:第三个表是创建库存记录时创建的表格;该表告诉我们库存记录是否包含机密信息。它包含应用程序ID,库存ID,FRMP ID以及用于确定与其关联的库存记录是否包含敏感数据的列。

关系: 应用程序可以属于许多库存记录,但库存记录只能有一个应用程序。 FRMP记录必须只有一个与之关联的库存记录,但库存记录可以在没有FRMP记录的情况下存在。

这是我正在努力做的事情,过去两天一直在努力做...

我需要一个每个应用程序的列表(按名称),对于部署它的每个记录,其中只有一个部署包含敏感数据。

例如,如果Inventory中的记录250具有应用程序名称74且FRMP.HoldsSensitive =“No”,但Inventory中的记录379具有应用程序名称74和FRMP.HoldsSensitive =“是”,我不希望看到应用程序74.

这并不像看起来那么容易。

修改

以下是一些示例数据和首选输出。

AppID     AppName   Vendor    
01        FooIt     Goodstuff Inc
02        BarIt     Greatstuff Co
03        SaltIt    Sweet Inc
04        SugarIt   Sweet Inc

InvID     AppName   Division  Facility  
01        FooIt     Corporate Nearville
02        SaltIt    Corporate Farville
03        SaltIt    USA       Sin City
04        SugarIt   USA       Sin City
05        BarIt     USA       Vice City
06        BarIt     USA       Sin City
07        FooIt     USA       Sin City
08        SaltIt    USA       Vice City

FRMPID    INVID     APPID     HoldsSS
01        01        01        Yes
02        02        03        Yes
03        03        03        No
04        05        02        No
05        06        02        No
06        07        01        No
07        08        03        Yes

查询应该只返回B​​arIt。它不应该返回SugarIt,因为在Inventory表中不存在SugarIt。

1 个答案:

答案 0 :(得分:1)

如果您只是想检索应用程序名称,那么'回合

SELECT ApplicationName
FROM APPLICATIONS
WHERE NOT EXISTS
(
SELECT *
FROM FRMP
WHERE FRMP.ApplicationID = APPLICATIONS.Application_ID
AND FRMP.HoldsSensitive = 'Yes'
)
AND EXISTS
(
SELECT *
FROM INVENTORY
WHERE INVENTORY.Application_ID = APPLICATIONS.Applications_ID
)