2012-11-20 40 views
1

我有这个疑问:重复行,不同的PK

SELECT pih.PID, piv.TSV, piv.Variable_ID, piv.Value_ID, piv.Manual_Value 
FROM Process_Instance_Value AS piv 
INNER JOIN Process_Instance_History AS pih ON piv.PID = pih.PID 
WHERE piv.Variable_ID IN (SELECT Variable_ID 
          FROM someTable 
          WHERE Transition_ID = @someValue) 
AND piv.PID = @someValue 

我得到这个:

enter image description here
我的问题是,这些行是重复的,在这一点上使用,我希望他们。 是否有可能仅在DISTINCT TSV上获得行?或类似的东西?

谢谢

+0

pih.PID你想在其中检索呢? – Gerrat

回答

2

你可以这样做:

;WITH CTE 
AS 
(
    SELECT 
     pih.PID, 
     piv.TSV, 
     piv.Variable_ID, 
     piv.Value_ID, 
     piv.Manual_Value, 
     ROW_NUMBER() OVER (PARTITION BY piv.TSV ORDER BY pih.PID) rownum 
    FROM Process_Instance_Value AS piv 
    INNER JOIN Process_Instance_History AS pih ON piv.PID = pih.PID 
    WHERE piv.Variable_ID IN (SELECT Variable_ID 
           FROM someTable 
           WHERE Transition_ID = @someValue) 
    AND piv.PID = @someValue 
) 
SELECT * 
FROM CTE 
WHERE rownum = 1; 

需要注意的是:,如果你想最大这将返回最低pih.PID为每个不同的piv.TSV,只需使用ORDER BY pih.PID DESC代替。

这是如何工作的:

分级功能ROW_NUMBER() OVER()将给予已在PARTITION BY列出的同一列,在我们的例子piv.TSV每个组排序号码,这个排名号码将被订购,用于每个组根据OVER子句中定义的ORDER BY子句,在本例中为ORDER BY pih.PID。我使用了CTE而不是使用子查询。

然后我用WHERE rownum = 1,因为排序号码rownum给予每一组已在递减排序位列同piv.TSV记录,然后与rownum = 1记录将与最低pih.PID记录(想想) 。

但是,您可以使用内得到同样的结果一起进行GROUP BY像这样:

SELECT 
     pih.PID, 
     piv.TSV, 
     piv.Variable_ID, 
     piv.Value_ID, 
     piv.Manual_Value 
    FROM Process_Instance_Value AS piv 
    INNER JOIN 
    (
     SELECT 
      TSV, MIN(PID) MinPID 
     FROM Process_Instance_Value 
     GROUP BY TSV 
    ) piv2 ON piv.PID = piv2.MinPID 
    INNER JOIN Process_Instance_History AS pih ON piv.PID = pih.PID 
    WHERE piv.Variable_ID IN (SELECT Variable_ID 
           FROM someTable 
           WHERE Transition_ID = @someValue) 
    AND piv.PID = @someValue 
+0

你能解释这是如何工作或给出一个链接?谢谢 – hermann

+0

“哪里rownum = 1”确保你只能得到1行...尽管有多少不同的piv.TSV的问题? – Gerrat

+0

@Gerrat每个TSV都有一行,这就是'PARTITION BY'正在做的事情。 – Lamak

0

你想

SELECT pih.PID, piv.Variable_ID, piv.Value_ID, piv.Manual_Value 
FROM Process_Instance_Value AS piv 
INNER JOIN Process_Instance_History AS pih ON piv.PID = pih.PID 
WHERE piv.Variable_ID IN (SELECT Variable_ID 
          FROM someTable 
          WHERE Transition_ID = @someValue) 
AND piv.PID = @someValue 
group by 
pih.PID, piv.Variable_ID, piv.Value_ID, piv.Manual_Value