从左表中删除重复项

时间:2015-03-24 19:42:53

标签: sql-server sql-server-2012

我在网上看了一些例子,遗憾的是没有找到解决方案。

我有这样的数据。

表A

TaskName Pattern
123      Did not find A
124      Did not find B

表B

中生成数据模式
VariantId LocalVariantId Pattern
345       222            Did not find A
345       223            Did not find A
345       224            <Something else>
346       234            Did not find A

表C

VariantId ParseRange
345       100
345       200
346       50

我需要结合三个表中的数据来生成像这样的数据

TaskName ParseRange
123      250 

250max(345) + max(346) = 200 + 50

的总和

我已编写查询,但问题在Table B中是重复的。

Table C,我做

select max(ParseRange) from TableC group by VariantId

这样我就可以200VariantId=345

然而,当我加入Table B时,除非我这样做     group by TableB.VariantId, 我得到了重复项,因此结果总和与250不一样。

这就像我的查询

SELECT
    TaskName
    , SUM(TC.ParseRange)
FROM
    TableB
    JOIN
    (
        SELECT
            VariantId
            , MAX(ParseRange)
        FROM TableC
        GROUP BY VariantId
    ) AS TC ON TableB.VariantId = TC.VariantId
    -- also join with table A on Pattern
GROUP BY TaskName

1 个答案:

答案 0 :(得分:0)

以下是一种可能的解决方案:SQL Fiddle

示例数据

DECLARE @TableA TABLE (TaskName int, Pattern varchar(50));
INSERT INTO @TableA ([TaskName], [Pattern]) VALUES
(123, 'Did not find A'),
(124, 'Did not find B');

DECLARE @TableB TABLE ([VariantId] int, [LocalVariantId] int, [Pattern] varchar(50));
INSERT INTO @TableB ([VariantId], [LocalVariantId], [Pattern]) VALUES
(345, 222, 'Did not find A'),
(345, 223, 'Did not find A'),
(345, 224, '<Something else>'),
(346, 234, 'Did not find A');

DECLARE @TableC TABLE ([VariantId] int, [ParseRange] int);
INSERT INTO @TableC ([VariantId], [ParseRange]) VALUES
(345, 100),
(345, 200),
(346, 50);

<强>解决方案

首先,我们列出了来自TableC的所有变体及其最大ParseRange - 这是CTE_Variants

然后,对于每个VariantId,我们需要从TaskName中找到TableACROSS APPLY执行此操作 - 对于每个VariantId,我们从TableA选择一个与TOP(1)相关的行。在此示例中,选择哪一行并不重要,因此CROSS APPLY内的查询没有ORDER BY。如果您的数据更复杂,您可能需要添加排序以选择正确的行。

然后按TaskName对结果进行分组,以计算最终总和。

WITH
CTE_Variants
AS
(
    SELECT
        VariantId
        ,MAX(ParseRange) AS MaxParseRange
    FROM @TableC
    GROUP BY VariantId
)
SELECT
    CA.TaskName
    , SUM(CTE_Variants.MaxParseRange) AS SumMaxParseRange
FROM
    CTE_Variants
    CROSS APPLY
    (
        SELECT TOP(1) TA.TaskName
        FROM
            @TableB AS TB
            INNER JOIN @TableA AS TA ON TA.Pattern = TB.Pattern
        WHERE
            TB.VariantId = CTE_Variants.VariantId
    ) AS CA
GROUP BY
    CA.TaskName
;

结果集

TaskName SumMaxParseRange
123      250