【问题标题】:SQL Exclude results from join or subquery where column names don't match up with multiple tablesSQL 从联接或子查询中排除列名与多个表不匹配的结果
【发布时间】: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 表中 FilenameNULL 并且客户端 NOTImages 表中的所有实例strong>ClientGroup 表,其中 GroupValueGroupValues(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(987651987650)都具有 文件名设置为NULL

我已尝试加入所有表,但似乎无法正确创建查询(我没有得到任何结果,或者我只得到例外组中客户端的结果 - 而我需要不在例外组中的那些) .我也尝试过创建一个子查询,但我似乎也无法让它工作......

非常感谢您对此提供任何帮助。
谢谢!

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    不确定我是否符合所有标准,但可以使用 NOT EXISTS 获得您想要的一般形式

    SELECT clientno, clientname, fkey, /*OTHER TABLE STUFF*/
        FROM (
            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
        ) incl
    
        WHERE NOT EXISTS (
            SELECT * FROM(
                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'
            ) excl
            WHERE excl.clientno = incl.ClientNo
            AND excl.clientname = incl.ClientName
        )
    ORDER BY fkey DESC
    

    【讨论】:

    • 我对您的代码进行了编辑以添加括号、初始选择中的其他表格内容以及查询末尾的 order by(需要对我的代码进行的小改动可能会有所帮助未来的其他人)
    • @ctwheels 好的,很高兴我能帮上忙
    【解决方案2】:
                SELECT im.FileKey
                FROM Images AS im
                INNER JOIN Files as Fi ON im.filekey = fi.filekey
    
    --NOW THAT WE KNOW ALL CLIENT KEYS THAT MEET THE REQUIREMENTS WE NEED TO GO GET THE FILEKEY
                INNER JOIN (
            -- FIND ALL IMAGES WHERE FILE IS NOT NULL
                SELECT F.clientKey
                FROM images AS i 
                INNER JOIN files AS F on f.fileKey = i.fileKey 
                WHERE i.filename IS NULL
    
                INTERSECT--GRAB THE INTERSECT BECAUSE WE WANT TO KNOW ALL CLIENTKEYS THAT MEET THE BELOW REQUIREMENTS
    
        --FIND ALL CLIENTS THAT ARE NOT IN EXCLUDED AND IN THE GROUPS TABLE WITH GROUPCODE =25
                SELECT C.ClientKey
                FROM CLIENTS AS C
                INNER JOIN  CLientGroup AS CG  ON C.clientKey = cg.clientkey AND cg.groupvalue != 'EXCLUDE'
                INNER JOIN Groups AS g on CG.groupCode = g.groupCode AND g.groupCodeKey = '25') AS x on x.clientkey = fi.clientkey
    

    我相信这会让你得到你想要的(未经测试)

    【讨论】:

    • 我尝试使用您的方法,它似乎并没有像我想的那样工作。我认为可以进行一些调整,但是我接受 Sam cd 的答案是正确的。无论如何,谢谢你的回答!
    猜你喜欢
    • 2010-11-15
    • 2015-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-16
    • 1970-01-01
    相关资源
    最近更新 更多