如何从 1st 和 2nd table 获取匹配记录,并且仅从 SQL 服务器中的 1st table 获取非匹配记录 已加入 1 个字段
How to get a a matching records from 1st and 2nd table and only non matching records from 1st table in SQL Server having joined by 1 field
我想从 2 table 中获取匹配记录,而仅从一个 table 中获取不匹配的记录。我在它们之间有两个公共字段,称为 Module_ID,第二个 table 中的一个字段称为 PK_ID。我想 return 来自第二个 table 的所有记录,最大值为 PK_ID 因为它有重复记录所以我想 return 具有最大值 PK_ID 的记录] 但我还需要来自 TAble 1 的记录与 Table 2 的匹配记录和来自 table 1.
的不匹配记录
当我只使用三列时,它 return 是正确的记录数,但当我使用更多时,它 return 比我想要的多
这是包含 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
这return是我想要的记录的正确编号。右 table 是第一 table,左 table 是第二。右 table 有更多记录,这些记录都是唯一的,没有重复,但左 table 有重复。
但是,如果我向该查询添加更多列,它会比所需记录多 return。有些列是 Table 1,有些字段是 Table 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
下面是结构和样本数据
Table 否 2 :- 所有唯一记录
Release_Management_Tran table 有
Module_ID Module_Name Request_id 复杂度优先 Recieved_Date Local_Soln
1 xyz 1 S 正常 12/6/2020 是
Failed_Module Failed_Resource 分配给平台目标日期
Y N 汤姆服务器 15/6/2020
Table no 1(Table no 2 的主键字段的多个实例)
PK_Id Module_ID(外键)Tran_Id 状态努力 Deliverable_Type ...
1 1 1 我 2 abcde
2 1 1 C 2 abcde
如您所见,我有多个 table 2 的 module_id 实例,但我只想从 table 1 中获取具有更高价值的模块PK_ID。如果在 Table 1 中没有相同 module_id 的记录,那么就是这样
来自 Table 模块 id 的 2 个实例。
希望我能解释清楚。如果需要进一步说明,请问我。
我在下面找到了此帖子的解决方案,可能对某些人有用。我使用 CTE 通过使用其中包含 table 的唯一 ID 的聚合 Max 来获取初始记录,然后将其与另一个 table 右连接。以下是完整的查询。
with CTEIkeaReport(MODULE_ID,PK_ID,MODULE_NAME,COMPLEXITY,PRIORITY,RECIEVED_DATE,LOCAL_SOLUTION,USER_FNAME,SERVICE_AREA,平台)
作为
(
Select im.MODULE_ID,max(ip.PK_ID) as PK_ID,MODULE_NAME,复杂度,优先级,RECIEVED_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 按 im.MODULE_ID、MODULE_NAME、复杂性、优先级、RECIEVED_DATE、LOCAL_SOLUTION、USER_FNAME、SERVICE_AREA 分组,平台
)
Select MODULE_NAME, COMPLEXITY,RECIEVED_DATE,datename(month,RECIEVED_DATE) as Month_Recieved ,CASE WHEN STATUS = 'C'然后 'DELIVERED' 当状态 = 'I' 然后 'IN PROGRESS' 当状态 = 'H' 然后 'ON HOLD' 当状态 = 'R' 然后 'REJECTED' 当状态= '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,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' 然后 'Client, Terminal Server, Server' 作为平台结束
FROM PACKAGE IP right JOIN CTEReport CT on CT.PK_ID = ip.PK_ID
我想从 2 table 中获取匹配记录,而仅从一个 table 中获取不匹配的记录。我在它们之间有两个公共字段,称为 Module_ID,第二个 table 中的一个字段称为 PK_ID。我想 return 来自第二个 table 的所有记录,最大值为 PK_ID 因为它有重复记录所以我想 return 具有最大值 PK_ID 的记录] 但我还需要来自 TAble 1 的记录与 Table 2 的匹配记录和来自 table 1.
的不匹配记录当我只使用三列时,它 return 是正确的记录数,但当我使用更多时,它 return 比我想要的多
这是包含 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
这return是我想要的记录的正确编号。右 table 是第一 table,左 table 是第二。右 table 有更多记录,这些记录都是唯一的,没有重复,但左 table 有重复。
但是,如果我向该查询添加更多列,它会比所需记录多 return。有些列是 Table 1,有些字段是 Table 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
下面是结构和样本数据
Table 否 2 :- 所有唯一记录 Release_Management_Tran table 有 Module_ID Module_Name Request_id 复杂度优先 Recieved_Date Local_Soln 1 xyz 1 S 正常 12/6/2020 是
Failed_Module Failed_Resource 分配给平台目标日期 Y N 汤姆服务器 15/6/2020
Table no 1(Table no 2 的主键字段的多个实例)
PK_Id Module_ID(外键)Tran_Id 状态努力 Deliverable_Type ... 1 1 1 我 2 abcde 2 1 1 C 2 abcde
如您所见,我有多个 table 2 的 module_id 实例,但我只想从 table 1 中获取具有更高价值的模块PK_ID。如果在 Table 1 中没有相同 module_id 的记录,那么就是这样 来自 Table 模块 id 的 2 个实例。
希望我能解释清楚。如果需要进一步说明,请问我。
我在下面找到了此帖子的解决方案,可能对某些人有用。我使用 CTE 通过使用其中包含 table 的唯一 ID 的聚合 Max 来获取初始记录,然后将其与另一个 table 右连接。以下是完整的查询。
with CTEIkeaReport(MODULE_ID,PK_ID,MODULE_NAME,COMPLEXITY,PRIORITY,RECIEVED_DATE,LOCAL_SOLUTION,USER_FNAME,SERVICE_AREA,平台)
作为 (
Select im.MODULE_ID,max(ip.PK_ID) as PK_ID,MODULE_NAME,复杂度,优先级,RECIEVED_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 按 im.MODULE_ID、MODULE_NAME、复杂性、优先级、RECIEVED_DATE、LOCAL_SOLUTION、USER_FNAME、SERVICE_AREA 分组,平台 )
Select MODULE_NAME, COMPLEXITY,RECIEVED_DATE,datename(month,RECIEVED_DATE) as Month_Recieved ,CASE WHEN STATUS = 'C'然后 'DELIVERED' 当状态 = 'I' 然后 'IN PROGRESS' 当状态 = 'H' 然后 'ON HOLD' 当状态 = 'R' 然后 'REJECTED' 当状态= '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,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' 然后 'Client, Terminal Server, Server' 作为平台结束 FROM PACKAGE IP right JOIN CTEReport CT on CT.PK_ID = ip.PK_ID