我有一个奇怪的问题的东西:我有两个表我希望与联盟的加入。我不希望任何重复列,但每个表都有一个额外的变量我写进它们来自哪里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))
我担心在最后添加的文本变量将阻止联盟功能无法正常删除重复值。是否有任何(简单/高效),确保工会删除表之间的重复值,但忽略文本变量,否则会导致工会阅读无重复的方式?
请注意,我在寻找简单的方法来做到这一点。我知道暴力强迫这几种方法,但效率和速度的担忧。
既然你想重复一个,你可以使用MIN()
用CTE
。 D
到来之前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 JOIN
上ProFilter
为左连接同样的事情。如果加入结果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)
嗨乔希,我不是专家,但我认为你可以尝试查询倾倒派生表,然后选择分钟(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