带有“max”过滤器的T-SQL连接
我正在使用SQL Server 2014 我希望以下内容不会给我重复的电话ID或号码:带有“max”过滤器的T-SQL连接,sql,sql-server,tsql,join,Sql,Sql Server,Tsql,Join,我正在使用SQL Server 2014 我希望以下内容不会给我重复的电话ID或号码: WITH Phones as ( SELECT * FROM (VALUES (1,'602 600 8000'), (2,'602 600 8001'), (3,'602 600 8002') ) AS Vict_t (Id,Number) ), InvoicePhones as ( SELECT * FROM (VALUES (10, 1, 100
WITH Phones as
(
SELECT * FROM (VALUES
(1,'602 600 8000'),
(2,'602 600 8001'),
(3,'602 600 8002')
) AS Vict_t (Id,Number)
), InvoicePhones as
(
SELECT * FROM (VALUES
(10, 1, 100, 'Alpha'),
(11, 1, 101, 'Bravo'),
(12, 1, 102, 'Charlie'),
(13, 2, 103, 'Alpha'),
(14, 2, 104, 'Bravo'),
(15, 2, 105, 'Charlie'),
(16, 3, 106, 'Alpha'),
(17, 3, 107, 'Bravo'),
(18, 3, 108, 'Charlie')
) as ip_t (Id,PhoneId,VoiceId, Name)
), Voices as
(
SELECT * FROM (VALUES
(100, '201701'),
(101, '201702'),
(102, '201703'),
(103, '201704'),
(104, '201705'),
(105, '201706'),
(106, '201708'),
(107, '201709'),
(108, '201710')
) AS Voices_t (Id,BillingCycle)
)
SELECT P.Id PhoneId, P.Number, IP.Name
FROM Phones P
LEFT JOIN InvoicePhones IP on IP.PhoneId = P.Id and IP.VoiceId =
(
select TOP 1 id
from Voices V
where V.Id = IP.VoiceId
order by V.BillingCycle desc
)
我无法理解为什么子选择没有消除重复项
我收到的是:
1 602 600 8000 Alpha
1 602 600 8000 Bravo
1 602 600 8000 Charlie
2 602 600 8001 Alpha
2 602 600 8001 Bravo
2 602 600 8001 Charlie
3 602 600 8002 Alpha
3 602 600 8002 Bravo
3 602 600 8002 Charlie
1 602 600 8000 Charlie
2 602 600 8001 Charlie
3 602 600 8002 Charlie
我期待的是:
1 602 600 8000 Alpha
1 602 600 8000 Bravo
1 602 600 8000 Charlie
2 602 600 8001 Alpha
2 602 600 8001 Bravo
2 602 600 8001 Charlie
3 602 600 8002 Alpha
3 602 600 8002 Bravo
3 602 600 8002 Charlie
1 602 600 8000 Charlie
2 602 600 8001 Charlie
3 602 600 8002 Charlie
本例使用简单的整数ID,但我使用的实际表使用的是uniqueidentifier。因此,我需要的答案必须考虑到这一点
我尝试了这两种版本,但对我来说都不起作用
我错过了什么
使现代化
除了我选择的答案之外,我意识到解决这个问题的另一个方法如下:
SELECT P.Id PhoneId, P.Number, IP.Name
FROM Phones P
LEFT JOIN InvoicePhones IP on IP.PhoneId = P.Id and IP.VoiceId =
(
select TOP 1 V.Id
from Voices V
INNER JOIN InvoicePhones IPS ON IPS.VoiceId = V.Id
WHERE P.Id = IPS.PhoneId
order by V.BillingCycle desc
)
我很好奇它们是否也可以通过外部应用来解决,看起来您需要使用ROW\u NUMBER来获取最新的ID,但最终的逻辑或是否需要第三个表还不清楚
输出
要包括第三个表:
输出
我不知道你想要什么。但你有这样的条件:
IP.VoiceId = (select TOP 1 id
from Voices V
where V.Id = IP.VoiceId
order by V.BillingCycle desc
)
correlation子句是V.id=IP.VoiceId。相等比较本质上是IP.VoiceId=V.id。它们是一样的。只要语音中至少有一条匹配记录,IP记录就通过了测试。使用您的数据,所有IP记录都通过了测试
我不知道你真正想做什么。如果你想要每个电话只有一行,那么我会认为存在或在
获得所需结果的最简单方法是:
select p.*
from phones p;
然而,我怀疑你想要更复杂的逻辑
;WITH Phones as
(
SELECT * FROM (VALUES
(1,'602 600 8000'),
(2,'602 600 8001'),
(3,'602 600 8002')
) AS Vict_t (Id,Number)
), InvoicePhones as
(
SELECT * FROM (VALUES
(10, 1, 100, 'Alpha'),
(11, 1, 101, 'Bravo'),
(12, 1, 102, 'Charlie'),
(13, 2, 103, 'Alpha'),
(14, 2, 104, 'Bravo'),
(15, 2, 105, 'Charlie'),
(16, 3, 106, 'Alpha'),
(17, 3, 107, 'Bravo'),
(18, 3, 108, 'Charlie')
) as ip_t (Id,PhoneId,VoiceId, Name)
), Voices as
(
SELECT * FROM (VALUES
(100, '201701'),
(101, '201702'),
(102, '201703'),
(103, '201704'),
(104, '201705'),
(105, '201706'),
(106, '201708'),
(107, '201709'),
(108, '201710')
) AS Voices_t (Id,BillingCycle)
)
,Expected
AS
(
SELECT P.Id PhoneId, P.Number, IP.Name
FROM Phones P
LEFT JOIN InvoicePhones IP on IP.PhoneId = P.Id and IP.VoiceId =
(
SELECT TOP 1 id
FROM Voices V
WHERE V.Id = IP.VoiceId
ORDER BY V.BillingCycle desc
)
)
SELECT PhoneId,Number,Name From
(
SELECT *,ROW_NUMBER()OVER(PARTITION BY Phoneid,Number ORDER BY Phoneid)AS Seq
FROM Expected
)DT
WHERE DT.Seq=3
输出
PhoneId Number Name
------------------------------
1 602 600 8000 Charlie
2 602 600 8001 Charlie
3 602 600 8002 Charlie
预期的结果是什么?您的样本数据不是很好,因为从手机中选择*就足以获得这些结果。我不明白为什么子选择没有消除重复项,为什么?您的subselect与您给定的数据中的say和1=1没有太大区别,因此它不会对您的整个查询产生影响。@GordonLinoff我在投影中添加了另一个字段,以使问题更清楚。为什么输出是Charlie?仍然不清楚为什么需要第三个表。我更新了我的问题,以澄清为什么必须连接所有三个表。再次检查编辑版本。我更新了我的问题,以澄清我正在使用的实际表具有唯一标识符键类型,而不是我显示的整数键值。因此,我需要一个不依赖于对任何键排序的答案;这就是为什么需要第三张表。