SQL:防止重复在所有除指定的列

问题描述 投票:1回答:2

我有一个奇怪的问题的东西:我有两个表我希望与联盟的加入。我不希望任何重复列,但每个表都有一个额外的变量我写进它们来自哪里SELECT子句指定:

SELECT EOU.EventSessionKey, EOU.EventSourceID, EOU.EventSeq, 
    EOU.EventColumnName, EOU.ProSymbol,
    EOU.ProKey, tP.isActive, tP.Description, 
    'POSITIVE' AS ErrType FROM EOU
LEFT JOIN dbRunoff.dbo.tPro tP 
    ON tP.Symbol COLLATE DATABASE_DEFAULT 
        = EOU.ProSymbol COLLATE DATABASE_DEFAULT
WHERE tP.IsActive = 1 AND (EOU.ProKey IS NULL OR  EOU.ProKey <= 0)

UNION

SELECT EOU.EventSessionKey, EOU.EventSourceID, EOU.EventSeq, 
    EOU.EventColumnName, EOU.ProSymbol,
    EOU.ProKey, tP.isActive, tP.Description, 
    'DUPLICATE' AS ErrType FROM EOU
LEFT JOIN dbRunoff.dbo.tPro tP 
    ON tP.Symbol COLLATE DATABASE_DEFAULT 
        = EOU.ProSymbol COLLATE DATABASE_DEFAULT
JOIN ProFilter PF ON PF.ProKey = tp.ProKey
WHERE tP.IsActive = 1 AND (EOU.ProKey IS NULL OR  EOU.ProKey <= 0))

我担心在最后添加的文本变量将阻止联盟功能无法正常删除重复值。是否有任何(简单/高效),确保工会删除表之间的重复值,但忽略文本变量,否则会导致工会阅读无重复的方式?

请注意,我在寻找简单的方法来做到这一点。我知道暴力强迫这几种方法,但效率和速度的担忧。

sql sql-server tsql
2个回答
3
投票

既然你想重复一个,你可以使用MIN()CTED到来之前P因此当加入上存在正它将使用重复。

只是一个方面说明,我要改写这个没有UNION

with cte as(
SELECT EOU.EventSessionKey, EOU.EventSourceID, EOU.EventSeq, 
    EOU.EventColumnName, EOU.ProSymbol,
    EOU.ProKey, tP.isActive, tP.Description, 
    'POSITIVE' AS ErrType FROM EOU
LEFT JOIN dbRunoff.dbo.tPro tP 
    ON tP.Symbol COLLATE DATABASE_DEFAULT 
        = EOU.ProSymbol COLLATE DATABASE_DEFAULT
WHERE tP.IsActive = 1 AND (EOU.ProKey IS NULL OR  EOU.ProKey <= 0)

UNION

SELECT EOU.EventSessionKey, EOU.EventSourceID, EOU.EventSeq, 
    EOU.EventColumnName, EOU.ProSymbol,
    EOU.ProKey, tP.isActive, tP.Description, 
    'DUPLICATE' AS ErrType FROM EOU
LEFT JOIN dbRunoff.dbo.tPro tP 
    ON tP.Symbol COLLATE DATABASE_DEFAULT 
        = EOU.ProSymbol COLLATE DATABASE_DEFAULT
JOIN ProFilter PF ON PF.ProKey = tp.ProKey
WHERE tP.IsActive = 1 AND (EOU.ProKey IS NULL OR  EOU.ProKey <= 0))

select distinct
    EventSessionKey
    ,EventSourceID
    ,EventSeq
    ,EventColumnName
    ,ProSymbol
    ,ProKey
    ,isActive
    ,Description
    ,min(cte2.ErrType)
from
    cte
    left join
    cte2 on cte.EventSessionKey = cte2.SessionKey --assumption based of column name. Use correct key to join.
group by
    EventSessionKey
    ,EventSourceID
    ,EventSeq
    ,EventColumnName
    ,ProSymbol
    ,ProKey
    ,isActive
    ,Description

编辑

这应该给你基于什么关我看到您查询......基本上,我改变了你INNER JOINProFilter为左连接同样的事情。如果加入结果TRUE那么它会根据你的UNION一直重复记录。如果它不存在,这将是积极的

SELECT 
    EOU.EventSessionKey, 
    EOU.EventSourceID, 
    EOU.EventSeq, 
    EOU.EventColumnName, 
    EOU.ProSymbol,
    EOU.ProKey, 
    tP.isActive, 
    tP.Description, 
    case when pf.ProKey is null then 'Positive' else 'Duplicate' end as ErrType
FROM 
    EOU
LEFT JOIN 
    dbRunoff.dbo.tPro tP 
    ON tP.Symbol COLLATE DATABASE_DEFAULT = EOU.ProSymbol COLLATE DATABASE_DEFAULT
LEFT JOIN 
    ProFilter PF 
    ON PF.ProKey = tp.ProKey
WHERE 
    tP.IsActive = 1 
    AND (EOU.ProKey IS NULL OR  EOU.ProKey <= 0)

0
投票

嗨乔希,我不是专家,但我认为你可以尝试查询倾倒派生表,然后选择分钟(ErrType)然后通过列名的其余组。

select q.EventSessionKey, q.EventSourceID, q.EventSeq, q.EventColumnName, q.ProSymbol,
q.ProKey, q.isActive, q.Description, min(q.ErrType) as [ErrType] from
(
SELECT EOU.EventSessionKey, EOU.EventSourceID, EOU.EventSeq, 
EOU.EventColumnName, EOU.ProSymbol,
EOU.ProKey, tP.isActive, tP.Description, 
'POSITIVE' AS ErrType FROM EOU
LEFT JOIN dbRunoff.dbo.tPro tP 
ON tP.Symbol COLLATE DATABASE_DEFAULT 
    = EOU.ProSymbol COLLATE DATABASE_DEFAULT
WHERE tP.IsActive = 1 AND (EOU.ProKey IS NULL OR  EOU.ProKey <= 0)

UNION

SELECT EOU.EventSessionKey, EOU.EventSourceID, EOU.EventSeq, 
EOU.EventColumnName, EOU.ProSymbol,
EOU.ProKey, tP.isActive, tP.Description, 
'DUPLICATE' AS ErrType FROM EOU
LEFT JOIN dbRunoff.dbo.tPro tP 
ON tP.Symbol COLLATE DATABASE_DEFAULT 
    = EOU.ProSymbol COLLATE DATABASE_DEFAULT
JOIN ProFilter PF ON PF.ProKey = tp.ProKey
WHERE tP.IsActive = 1 AND (EOU.ProKey IS NULL OR  EOU.ProKey <= 0)) as q
© www.soinside.com 2019 - 2024. All rights reserved.