问题描述
抱歉,标题太长,很难描述我想要做什么。正如您将在下面看到的那样,它很容易理解,但很难概括为一个标题。
| ParentID | ChildID | Flag |
| 100 | 1 | 0 |
| 100 | 1 | 1 |
| 100 | 2 | 0 |
| 100 | 2 | 0 |
| 200 | 1 | 1 |
| 200 | 1 | 1 |
标志列中只会有 1 或 0。 我需要过滤结果,以便每个父/子组合只有一行。 如果在上面的完整结果集中有一个或多个记录,其中父/子组合为 1,则标志应为 1,否则应为零。
因此,如果应用于上述结果将是:
| ParentID | ChildID | Flag |
| 100 | 1 | 1 |
| 100 | 2 | 0 |
| 200 | 1 | 1 |
我只处理 ChildID 和 Flag 列:
DECLARE @InMemoryResultsFirstPass AS TABLE (ChildID Integer,Flag Integer)
DECLARE @InMemoryResultsRecs AS TABLE (ChildID Integer,Flag Integer)
INSERT INTO @InMemoryResultsFirstPass
SELECT 1 ChildID,0 Flag
UNION SELECT 1 ChildID,1 Flag
UNION SELECT 2 ChildID,0 Flag
UNION SELECT 2 ChildID,1 Flag
UNION SELECT 1 ChildID,1 Flag
select * from @InMemoryResultsFirstPass
INSERT INTO @InMemoryResultsRecs
SELECT disTINCT
result.*
FROM @InMemoryResultsFirstPass imr
CROSS APPLY (
SELECT TOP 1
*
FROM @InMemoryResultsFirstPass imrfp
WHERE imrfp.ChildID = imr.ChildID
ORDER BY imrfp.Flag DESC
) result
select * from @InMemoryResultsRecs
但是一旦我将它添加到 ParentID 列中,我就无法弄清楚如何执行此操作。我尝试了几种不同的方法,尝试在 CROSS APPLY 中使用 ParentID 上的 GROUP BY 进行嵌套查询,但无论我尝试什么,我都会丢失 ParentID = 200 条记录:
DECLARE @InMemoryResultsFirstPass AS TABLE (ParentID Integer,ChildID Integer,Flag Integer)
DECLARE @InMemoryResultsRecs AS TABLE (ParentID Integer,Flag Integer)
INSERT INTO @InMemoryResultsFirstPass
SELECT 100 ParentID,1 ChildID,0 Flag
UNION SELECT 100 ParentID,1 Flag
UNION SELECT 100 ParentID,2 ChildID,0 Flag
UNION SELECT 200 ParentID,1 Flag
UNION SELECT 200 ParentID,1 Flag
select * from @InMemoryResultsFirstPass
INSERT INTO @InMemoryResultsRecs
SELECT disTINCT
result.*
FROM @InMemoryResultsFirstPass imr
CROSS APPLY (
SELECT TOP 1
*
FROM @InMemoryResultsFirstPass imrfp
WHERE imrfp.ChildID = imr.ChildID
ORDER BY imrfp.Flag DESC
) result
select * from @InMemoryResultsRecs
如有任何帮助,我们将不胜感激。
感谢您抽出宝贵时间。
解决方法
实际上,我刚刚解决了:
SELECT ParentID,ChildID,MAX(Flag) AS Flag
FROM @InMemoryResultsFirstPass
GROUP BY ParentID,ChildID
ORDER BY ParentID,ChildID
希望这对其他人有帮助:-)