sql - 两张表,返回不同的许可证号
问题描述
有两张表格,显示他们登记的狗的主人信息;一个用于 2018 年,另一个用于 2019 年。每个表具有相同的列、名称等。
我只需要按许可证号列出一条完整记录。比如狗可能不是2019年登记的,而是2018年登记的。所以如果2019表中不包含2018年的记录,我需要列出。如果有两条记录(一条为 2018 年,另一条为 2019 年),我只想列出 2019 年的记录。
联盟不起作用,即因为“RegNumber”或狗牌号码每年都在变化;更不用说可能的地址更改等。我尝试了 union、intersect 和 except 的组合,但似乎没有任何工作正常。有任何想法吗?
SELECT [License Number] AS [LicenseNumber], [Last Name] AS [LastName], [First Name] AS [Firstname], [Street Name] AS [StreetName], [Address2], [City], [State], [Zip], [Phone], '' AS [Email], [Reg Number] AS [RegNumber], [Dog Name] AS [DogName], [Dog Breed] AS [Breed], [Purchased] AS [Year], [Sex], [Altered], [Color], [Vet] AS [Veterinarian], [RabieTag] AS [RabiesTagNumber], [RabiesTag_Exp] AS [RabiesTagExpiration], [Dog Number] AS [OwnerID], [Reg Number] AS [TagNumber]
FROM [dbo].[Dog_Info_2019]
WHERE Flag is not null
UNION
SELECT [License Number] AS [LicenseNumber], [Last Name] AS [LastName], [First Name] AS [Firstname], [Street Name] AS [StreetName], [Address2], [City], [State], [Zip], [Phone], '' AS [Email], [Reg Number] AS [RegNumber], [Dog Name] AS [DogName], [Dog Breed] AS [Breed], [Purchased] AS [Year], [Sex], [Altered], [Color], [Vet] AS [Veterinarian], [RabieTag] AS [RabiesTagNumber], [RabiesTag_Exp] AS [RabiesTagExpiration], [Dog Number] AS [OwnerID], [Reg Number] AS [TagNumber]
FROM [dbo].[Dog_Info_2018]
WHERE Flag is not null
ORDER BY [LicenseNumber]
当我执行上述查询时,显示 2018 年和 2019 年的记录,总共有 22569 条记录;11176 行在 2018 表中,11176 行在 2019 表中。
我什至尝试过 NOT IN,但这仅列出了不在一个表中的记录。
谢谢..
解决方案
我用我创建的一些模拟数据测试了下面的 SQL 脚本,它工作正常。我还创建了一个视图。我使用 UNION ALL 检索所有数据,然后使用窗口函数过滤外部 WHERE 中的重复项。我按 LicenseNumber 分区,因为它是动物独有的。
它不是最漂亮的,但它会得到你需要的数据,直到你想出一个更干净的解决方案。
SELECT LicenseYear
, [License Number] AS [LicenseNumber], [Last Name] AS [LastName], [First Name] AS
[Firstname], [Street Name] AS [StreetName], [Address2], [City], [State], [Zip],
[Phone], '' AS [Email], [Reg Number] AS [RegNumber], [Dog Name] AS [DogName], [Dog
Breed] AS [Breed], [Purchased] AS [Year], [Sex], [Altered], [Color], [Vet] AS
[Veterinarian], [RabieTag] AS [RabiesTagNumber], [RabiesTag_Exp] AS
[RabiesTagExpiration], [Dog Number] AS [OwnerID], [Reg Number] AS [TagNumber]
FROM (
SELECT ROW_NUMBER() OVER (PARTITION BY LicenseNumber ORDER BY LicenseNumber, LicenseYear DESC ) AS 'RowNum'
, *
FROM (
--SELECT 2020 AS 'LicenseYear'
--, [License Number] AS [LicenseNumber], [Last Name] AS [LastName], [First Name] AS [Firstname], [Street Name] AS [StreetName], [Address2], [City], [State], [Zip], [Phone], '' AS [Email], [Reg Number] AS [RegNumber], [Dog Name] AS [DogName], [Dog Breed] AS [Breed], [Purchased] AS [Year], [Sex], [Altered], [Color], [Vet] AS [Veterinarian], [RabieTag] AS [RabiesTagNumber], [RabiesTag_Exp] AS [RabiesTagExpiration], [Dog Number] AS [OwnerID], [Reg Number] AS [TagNumber]
--FROM [dbo].[Dog_Info_2020]
--WHERE Flag is not null
--UNION ALL
SELECT 2019 AS 'LicenseYear'
, [License Number] AS [LicenseNumber], [Last Name] AS [LastName], [First Name] AS [Firstname], [Street Name] AS [StreetName], [Address2], [City], [State], [Zip], [Phone], '' AS [Email], [Reg Number] AS [RegNumber], [Dog Name] AS [DogName], [Dog Breed] AS [Breed], [Purchased] AS [Year], [Sex], [Altered], [Color], [Vet] AS [Veterinarian], [RabieTag] AS [RabiesTagNumber], [RabiesTag_Exp] AS [RabiesTagExpiration], [Dog Number] AS [OwnerID], [Reg Number] AS [TagNumber]
FROM [dbo].[Dog_Info_2019]
WHERE Flag is not null
UNION ALL
SELECT 2018 AS 'LicenseYear'
, [License Number] AS [LicenseNumber], [Last Name] AS [LastName], [First Name] AS [Firstname], [Street Name] AS [StreetName], [Address2], [City], [State], [Zip], [Phone], '' AS [Email], [Reg Number] AS [RegNumber], [Dog Name] AS [DogName], [Dog Breed] AS [Breed], [Purchased] AS [Year], [Sex], [Altered], [Color], [Vet] AS [Veterinarian], [RabieTag] AS [RabiesTagNumber], [RabiesTag_Exp] AS [RabiesTagExpiration], [Dog Number] AS [OwnerID], [Reg Number] AS [TagNumber]
FROM [dbo].[Dog_Info_2018]
WHERE Flag is not null
) Data
) Data
WHERE RowNum = 1
推荐阅读
- mongodb - 将 Heroku 与 Mongo Atlas 结合使用的缓慢请求,仅在这种情况下
- vue.js - 在子组件上使用哪个生命周期钩子在 Vuejs 中的父组件之后运行?
- c# - 数据库表未保存
- javascript - 如何响应在 Vue 事件处理程序中解决的承诺
- reactjs - 在 Chromium/Chrome 中自动将 cookie 的属性设置为 SameStite=None
- jquery - 如果 div 孩子身高 > 69,则添加 CSS 类
- sql-server - 什么可能会阻止 SQL Server 以最佳方式处理查询过滤器
- css - 是否可以像“@include media-breakpoint-up(900px)”(bootstrap4)这样以像素为单位设置断点?
- python - Pandas 多个 groupby 和过滤器
- java - W/TextToSpeech:说话失败:未绑定到 TTS 引擎,声音不起作用