Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带有“max”过滤器的T-SQL连接_Sql_Sql Server_Tsql_Join - Fatal编程技术网

带有“max”过滤器的T-SQL连接

带有“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

我正在使用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, '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?仍然不清楚为什么需要第三个表。我更新了我的问题,以澄清为什么必须连接所有三个表。再次检查编辑版本。我更新了我的问题,以澄清我正在使用的实际表具有唯一标识符键类型,而不是我显示的整数键值。因此,我需要一个不依赖于对任何键排序的答案;这就是为什么需要第三张表。