我想从两个表中得到匹配的记录,从一个表中只得到不匹配的记录。它们之间有两个公共字段,称为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示例的记录。
我希望我能解释清楚。如果需要进一步的澄清,请问我。
1条答案
按热度按时间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