在sql server中,如何从第一个表和第二个表中获取匹配的记录,以及仅从第一个表中获取由1个字段联接的不匹配的记录

798qvoo8  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(423)

我想从两个表中得到匹配的记录,从一个表中只得到不匹配的记录。它们之间有两个公共字段,称为module\u id,第二个表中有一个字段称为pk\u id。我想返回第二个表中的所有记录,其中pk\u id的值最大,因为它有重复的记录,所以我想返回具有最高pk\u id值的记录,但我还需要表1中具有与表2匹配的记录且不匹配的记录表1中的记录。
当我只使用三列时,它会返回正确的记录数,但当我使用更多时,它会返回比我想要的更多的记录数
这里有3个字段的查询,我也会给出完整的查询,我想适当的计数。我必须用临时table吗?
请帮忙。

Select 
    IM.MODULE_ID, 
    Max(Pk_Id), Module_Name 
from 
    PACKAGE IP 
right join 
    RELEASE_MANAGEMENT_TRAN IM on IM.MODULE_ID = IP.MODULE_ID 
Group by 
    IM.MODULE_ID,MODULE_NAME

这将返回我想要的正确记录数。右桌是第一桌,左桌是第二桌。右表有更多的记录,这些记录都是唯一的,没有重复项,但左表有重复项。
但是如果我在这个查询中添加更多的列,它将返回比所需记录更多的记录。有些列是表1的,有些字段是表2的。
这是我想要的所有字段的整个查询:

Select  
    IM.MODULE_ID, max(ip.PK_ID), MODULE_NAME, 
    COMPLEXITY, RECEIVED_DATE, 
    datename(month, RECEIVED_DATE) as Month_Received,
    CASE 
       WHEN STATUS = 'C' THEN 'DELIVERED' 
       WHEN STATUS = 'I' THEN 'IN PROGRESS' 
       WHEN STATUS = 'H' THEN 'ON HOLD' 
       WHEN STATUS = 'R' THEN 'REJECTED' 
       WHEN STATUS = 'D' THEN 'CANCELLED' 
    END AS STATUS,
    Delivered_Date, DATENAME(month, Delivered_Date) as Month_Delivered,
    SLA,
    CASE 
       WHEN IP.Failed_Module = '1' THEN 'YES' 
       WHEN ip.Failed_Module = '2' THEN 'NO' 
    END Failed_Module,
    First_Time_Platform_Test, im.TARGET_DATE, 
    ip.COMMENTS, ip.BUILD_NAME, PACKAGING_EFFORTS, SERVICE_AREA,
    CASE 
       WHEN LOCAL_SOLUTION = '1' THEN 'Y'  
       WHEN LOCAL_SOLUTION = '2' THEN 'N' 
    END LOCAL_SOLUTION,
    SOURCE_TYPE, Deliverable_Type,
    CASE 
       WHEN PLATFORM = 'C' THEN 'Client' 
       WHEN PLATFORM = 'S' THEN 'Server' 
       WHEN PLATFORM = 'TS' THEN 'Terminal Server' 
       WHEN PLATFORM = 'CS' THEN 'Client, Server' 
       WHEN PLATFORM = 'CTS' THEN 'Client, Terminal Server'  
       WHEN PLATFORM = 'TSS' THEN 'Terminal Server, Server' 
       WHEN PLATFORM = 'CTSS' THEN 'Client, Terminal Server, Server' 
    END AS PLATFORM
FROM 
    PACKAGE IP 
RIGHT JOIN 
    RELEASE_MANAGEMENT_TRAN IM ON IP.MODULE_ID = IM.MODULE_ID 
GROUP BY
    IM.MODULE_ID, MODULE_NAME, COMPLEXITY, RECEIVED_DATE,
    ip.STATUS, Delivered_Date, SLA, ip.Failed_Module,
    First_Time_Platform_Test, im.TARGET_DATE, ip.COMMENTS, ip.BUILD_NAME,
    PACKAGING_EFFORTS, SERVICE_AREA, LOCAL_SOLUTION, SOURCE_TYPE,
    Deliverable_Type, PLATFORM

下面是结构和示例数据
表2:-所有唯一记录发布\u管理\u事务表具有模块\u id模块\u名称请求\u id复杂性优先级已接收\u日期本地\u解决方案1 xyz 1 s正常12/6/2020是
失败的\u模块\u资源分配到平台targetdate y n tom服务器的失败日期:2020年6月15日
表1(表2主键字段的多个示例)
pk\u id module\u id(外键)tran\u id status effects deliverable\u type。。。1 1 1 i 2 de 2 1 c 2 de
如您所见,我有多个表2的module\u id示例,但我只想从表1中选取pk\u id值较高的模块。如果表1中没有相同的模块id的记录,那么只有来自表2中模块id示例的记录。
我希望我能解释清楚。如果需要进一步的澄清,请问我。

w8f9ii69

w8f9ii691#

我已经得到了下面这个帖子的解决方案,以便它可能对某人有用。我使用cte获取初始记录,方法是使用aggregate max和其中表的唯一id,然后将其与另一个表右键联接。下面是完整的查询。
带cteikeareport(模块id、主键id、模块名称、复杂性、优先级、接收日期、本地解决方案、用户名称、服务区域、平台)
作为(
选择im.module_id,max(ip.pk_id)作为pk_id,module_name,complexity,priority,received_date,local_solution,user_fname,service_area,platform from tblpackage ip right join release_management im on im.module_id=ip.module_id inner join user_master um on um.id=im.assigned_to group by im.module_id,module_name,complexity,priority,received_date,本地解决方案、用户名称、服务区域、平台)
选择模块名称、复杂性、接收日期、日期名称(月、接收日期)作为接收月份,状态为“c”时选择大小写,状态为“i”时选择“delivered”,状态为“h”时选择“in progress”,状态为“h”时选择“on hold”,状态为“r”时选择“rejected”,状态为“d”时选择“cancelled”,状态为“d”时选择“end”,状态为“delivered”,日期为“month,交货日期)交货月份、sla、案例(当ip.failed\u module='1'时)、案例(当ip.failed\u module='2'时)、案例(no)结束失败的\u module、第一次\u平台\u测试、ip.comments、ip.build\u name、打包\u努力、服务\u区域、案例(当local\u solution='1'时)、案例(当local\u solution='2'时)、案例(当local\u solution='y'2'时)、案例(当local\u solution='n'结束local\u solution时)、源\u type、可交货\u type,当平台='c'然后是'client'当平台='s'然后是'server'当平台='ts'然后是'terminal server'当平台='cs'然后是'client,server'当平台='cts'然后是'client,terminal server'当平台='tss'然后是'terminal server,server'当平台='ctss'然后是'client,terminal server,服务器端作为平台从包ip right join ctereport ct on ct.pk\u id=ip.pk\u id

相关问题