如何按名称查找不匹配的第n个子行?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何按名称查找不匹配的第n个子行?相关的知识,希望对你有一定的参考价值。

我正在尝试编写一个查询来查找第n个子记录,只有第n个子记录名称不匹配。

简化的数据结构:

  • 根(PK:id) Job(PK:id,FK:idRoot - > Root.id) 任务(PK:id,FK:idParent - > Job.id,FK:idRoot - > Root.id)

所有ID字段都是字符串(我受当前设计的支配,不是我们要改变的)

这个想法是,子查询每个根只能获得一个匹配,并且将根据来自其他根的另一个匹配来评估这些匹配。除非子查询的所有结果都匹配(在指定的行上),否则它们都会失败。基本上我需要所有第n个任务在所有选定的根中具有相同的名称,否则它们都会失败。

我有一个查询,它给我每个根的每个第n个子记录(其中Task是子表)。但是,我无法弄清楚如何检查平等。此外,这需要适用于SQL Compact和SQL Server,这限制了某些功能。

这是n = 1(第一个任务)

SELECT COUNT(r.id) as RowIndex, t.id, t.idRoot, t.Name
FROM Task t
  INNER JOIN Job j ON j.id = t.idParent
  INNER JOIN (
    SELECT b.id, b.idParent, b.idRoot, b.StartDate
    FROM Task b
      INNER JOIN Job c ON b.idParent = c.idRec
  ) r ON t.StartDate >= r.StartDate
      AND r.idParent = j.id 
      AND t.idRoot = r.idRoot
WHERE t.idRoot IN ('1', '2', '3', '4')
  AND j.Type LIKE '%Example%'
GROUP BY t.idRoot, t.id, t.Name
HAVING COUNT(r.id) = 1    

这给了我一些类似的东西:

╔══════════╦════╦════════╦════════════╗
║ RowIndex ║ ID ║ IDRoot ║    Name    ║
╠══════════╬════╬════════╬════════════╣
║        1 ║  4 ║      2 ║ 1st Task   ║
║        1 ║  7 ║      3 ║ 1st Task   ║
║        1 ║ 11 ║      4 ║ First Task ║
╚══════════╩════╩════════╩════════════╝

因此,在上面的结果中,我正确地从“示例”作业类型中返回第一个任务。我无法弄清楚如何在名字不匹配的情况下获得结果。如果每个名称都是“第一个任务”,则查询应该返回任何内容。

更新:

Here's a link到pastebin,可以创建表并加载样本数据。

查询A返回作业类型A的第一个任务,结果显示任务名称不匹配。因此,我希望返回这两个任务ID。

查询B返回作业类型B的第一个任务,结果显示所有任务名称匹配。因此,我希望不返回任何这些任务ID。

答案

尝试使用以下查询:


SELECT 
r.ID 
, j.TYPE 
, t.Name 
, t.StartDate 
INTO #CoreData 
FROM root r 
INNER JOIN job j 
ON j.idRoot = r.id 
INNER JOIN task t 
ON t.idParent = j.id 
AND t.idRoot = r.id 

SELECT 
c.ID 
, c.Name 
, c.StartDate 
, c.TYPE 
, x.RowID 
INTO #CoreDataWithRowID 
FROM #CoreData c 
CROSS APPLY ( 
SELECT 
COUNT(*) AS RowID 
FROM #CoreData cd 
WHERE cd.TYPE = c.TYPE 
AND cd.ID = c.ID 
AND cd.StartDate <= c.StartDate 
) x 


SELECT 
oa.* 
FROM #CoreDataWithRowID oa 
INNER JOIN #CoreDataWithRowID ob 
ON oa.TYPE = ob.TYPE 
AND oa.RowID = ob.RowID 
AND oa.ID <= ob.ID 
WHERE oa.Name != ob.Name 
UNION 
SELECT 
oa.* 
FROM #CoreDataWithRowID oa 
INNER JOIN #CoreDataWithRowID ob 
ON oa.TYPE = ob.TYPE 
AND oa.RowID = ob.RowID 
AND oa.ID >= ob.ID 
WHERE oa.Name != ob.Name

这有望解决SQL Server Compact Edition引起的一些限制。

以上是关于如何按名称查找不匹配的第n个子行?的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode810. 黑板异或游戏/455. 分发饼干/剑指Offer 53 - I. 在排序数组中查找数字 I/53 - II. 0~n-1中缺失的数字/54. 二叉搜索树的第k大节点(代码片段

linux下日志文件的查找(tail和grep)

[ jquery 选择器 :nth-child ] 选取匹配其父元素下的第N个子或奇偶元素

字符串匹配(KMP)

Shell脚本

如何按名称或类型查找WPF控件?