【发布时间】:2015-10-22 01:26:02
【问题描述】:
好的,我正在使用现有数据库(无法编辑表、列等)。我被要求为客户创建包含数据的报告。在我们需要为某些客户创建排除组之前,这一直很好。 为了正确执行此查询,需要解析 8 个表以获取数据库中的信息。我已尽可能将其“简化”为 6 张桌子。 以下表格是现有表格,按照我能想到的最佳顺序排列。
表格:客户
ClientKey ClientNo ClientName
1 12345 ABC
2 12346 DEF
3 12347 GHI
4 12348 JKL
5 12349 MNO
6 12350 PQR
表:ClientGroup
ClientKey GroupCode GroupValue
12345
12346
12347 其他东西 一些东西
表格:组
GroupCode GroupCodeKey
排除组 25
其他东西 14
表格:GroupValues
GroupCode GroupValue
排除组 排除
其他的 一些东西
排除组 一些东西
表格:图片
文件密钥 文件名
987654 NULL
987653 文件名.jpg
987652 文件名.jpg
987651 NULL
987650 NULL
表格:文件
文件密钥 客户端密钥
987654 12345
987653 12345
987652 12346
987651 12347
987650 12347
为了更好地解释这些表格:
- 客户拥有我们的客户
- ClientGroup 包含一个列表,其中列出了哪些客户端属于哪些组以及该客户端在该组中分配的值(可以为客户端分配多个组,和/或一个组的多个值)
-
Groups 包含现有组的列表以及 GroupCodeKey。参考此表很重要,因为 GroupCode 值可以更改,因此例如参考
'25'是访问正确 GroupCode 的最佳方式 - GroupValues 包含可以分配给 GroupCode(组)的所有可能的 GroupValues 的列表。可以添加、删除、更改它们。
-
Images 通过 FileKey 列指向 Files 表,该列通过 ClientKey 指向 Clients 表 列。 Images 表告诉我们客户的文件是否有图像(如果不存在则由
NULL定义) - 文件 包含属于客户的所有文档的列表。客户可以(并且很可能会)拥有多个文档/文件。
我需要做什么:
我需要找到 Images 表中 Filename 为 NULL 并且客户端 NOT 在 Images 表中的所有实例strong>ClientGroup 表,其中 GroupValue 的 GroupValues(table)GroupValue(column) 等于 'EXCLUDE',并且在 Groups(table)GroupCode(column) 的 em>GroupCode 等于 Groups(table)GroupCodeKey(列)'25'
在下面的代码中,忽略上面表格中看不见的列,它们存在,但是为了简化上面的代码和表格,我已经从代码中删除了它们。它们仍然与下面的代码中的 select 相关,因为两个查询都从数据库中提取不同列的信息,这阻止了我在两个查询之间执行 EXCEPT
当前代码(简化)我必须得到所有带有NULL 图像的客户端是:
SELECT f.FileKey AS fkey, f.fNo AS fno, f.fDate AS fdate, cli.ClientNo AS clientno, cli.ClientName AS clientname, /*OTHER TABLE STUFF*/
FROM Files as f
LEFT JOIN Images as img
ON f.FileKey=img.FileKey
/*OTHER LEFT JOINS AND TABLES HERE RETURNING OTHER DATA*/
WHERE
img.[Filename] IS NULL
ORDER BY f.FileKey DESC
我必须获取组中所有具有'25' 的GroupCodeKey 和'EXCEPT' 的GroupValue 的客户端的当前代码是:
SELECT cli.ClientNo AS clientno, cli.ClientName AS clientname
FROM Clients AS cli
LEFT JOIN ClientGroup AS cg
ON cg.ClientKey = cli.ClientKey
LEFT JOIN Groups AS gc
ON gc.GroupCode = cg.GroupCode
LEFT JOIN GroupValue AS gv
ON gv.GroupCode = gc.GroupCode
WHERE
gc.GroupCodeKey='25' AND
gv.GroupValue='EXCLUDE'
以上两个查询都完全按照自己的预期工作。 我如何结合这些查询来给我想要的输出?
所需的输出(根据上面的表格及其内容)将是与第一个查询相匹配的信息减去第二个查询:
- 客户编号:123457
- 客户名称:GHI
- 文件密钥:987651
AND - 客户编号:123457
- 客户名称:GHI
- 文件密钥:987650
这两个结果都与不属于异常组 '25' 且值为 'EXCLUDE' 的客户端匹配,并且 FileKey(987651 和 987650)都具有 文件名设置为NULL
我已尝试加入所有表,但似乎无法正确创建查询(我没有得到任何结果,或者我只得到例外组中客户端的结果 - 而我需要不在例外组中的那些) .我也尝试过创建一个子查询,但我似乎也无法让它工作......
非常感谢您对此提供任何帮助。
谢谢!
【问题讨论】:
标签: sql sql-server