如何 select 一个不同的列表,其中单个引用有 2 个子引用,但每个子引用值也有 1 个以上

How to select a distinct list where a single reference has 2 sub-references but also has more than 1 of each sub-reference value

我正在尝试 select 不同的 TRMANE、TRATSA 列表,其中有多个不同值的 TRASTA 与 TRMANE 关联。

这是 table 的摘录; WHTRANP

TRMANE   TRASTA
56819     5   
56819     5   
56819     4   
56833     5   
56833     4   
56844     5   
56844     4   
56880     5   
56880     5   
56880     4   
56880     4   

N.B。 - 从上面可以看出,可能有多个 TRASTA 与 TRMANE 具有相同的值,我认为这就是导致我出现问题的原因。

理想情况下,我最终会得到;

TRMANE   TRASTA
56819     5   
56819     4   
56833     5   
56833     4   
56844     5   
56844     4   
56880     5   
56880     4   

如果我这样做;

SELECT TRMANE, TRASTA   
  FROM WHTRANP           
WHERE TRMANE <> 0        
 GROUP BY TRMANE, TRSTA
 HAVING COUNT(TRASTA) > 2
 ORDER BY 1, 2 DESC      

它 returns 一个不同的清单列表,无论它们是否具有 2 个 TRASTAS - 即;

TRMANE   TRASTA
     4     5   
     5     5   
     7     5   
     8     5   
     9     5   
    10     5   
    11     5   
    13     5   
    14     5   
    15     5   
    16     5   

这是哪里;

SELECT TRMANE as TRMANE, TRASTA AS TRASTA
  FROM WHTRANP                           
WHERE TRMANE <> 0                        
 GROUP BY TRMANE, trasta                 
 HAVING COUNT(DISTINCT TRASTA) > 2       
 ORDER BY 1, 2 DESC  

没有结果。

假设您的 DB2 版本支持窗口函数:

select *
from 
 (
   SELECT TRMANE, TRASTA, -- distinct combinations
       COUNT(*) OVER (PARTITION BY TRMANE) AS cnt  -- number of rows per TRMANE
     FROM WHTRANP           
   WHERE TRMANE <> 0        
   GROUP BY TRMANE, TRSTA
 ) as dt
WHER cnt > 1 -- more than 1 distinct values
ORDER BY 1, 2 DESC     

您的查询正在查找 trMane 链接到多个(唯一)traSta 的那些行。就其本身而言,这很简单:

SELECT trMane
FROM WHTranP
GROUP BY trMane
HAVING COUNT(DISTINCT traSta) > 1

问题当然是获取所有这些 traSta 值。分组移除了我们输出它们的能力(除非窗口函数可用),所以我们需要做一些别的事情:再次加入 table。

SELECT DISTINCT WHTranP.trMane, WHTranP.traSta
FROM WHTranP
JOIN (SELECT trMane
      FROM WHTranP
      GROUP BY trMane
      HAVING COUNT(DISTINCT traSta) > 1) Multiples
  ON Multiples.trMane = WHTranP.trMane
ORDER BY WHTranP.trMane, WHTranP.traSta

SQL Fiddle Example

...通过加入我们之前生成的列表,现在我们需要做的就是删除重复的 traSta 值,外部 DISTINCT 很容易为我们处理这些值。