2011-04-20 204 views
3

我有一个包含复合主键的表格。这是一个交叉引用表,看起来像这样使用复合主键查询表格

Table 
ID Relationship    ID2 
1  Spouse     10 
2  Employee     20 
2  Former Employee   20 
3  Former Employee   30 
4  Child     40 

我想在那里ID2匹配编写一个查询,你有雇员和前雇员为同一ID

ID Relationship    ID2 
2  Employee     20 
2  Former Employee   20  

感谢所有帮助!

+1

是否使用的是'RDBMS'? – Quassnoi 2011-04-20 15:05:33

+0

最好简单地选择该ID的所有记录,并将它们在应用程序中转换。特别是因为您需要的列数会因每个ID而异。 – HLGEM 2011-04-20 15:05:34

回答

2

OracleSQL ServerPostgreSQL

SELECT * 
FROM (
     SELECT t.*, 
       COUNT(*) OVER (PARTITION BY id, id2) AS cnt 
     FROM mytable t 
     WHERE relationship IN ('Employee', 'Former Employee') 
     ) q 
WHERE cnt = 2 

跨平台版本:

SELECT t.* 
FROM (
     SELECT id, id2 
     FROM mytable 
     WHERE relationship IN ('Employee', 'Former Employee') 
     GROUP BY 
       id, id2 
     HAVING COUNT(*) = 2 
     ) q 
JOIN mytable t 
ON  t.id = q.id 
     AND t.id2 = q.id2 
     AND t.relationship IN ('Employee', 'Former Employee') 
+0

感谢Quassnoi!它的Oracle和我尝试了第二个查询。它提取了我想要的数据,但也拉起了员工或前雇员的身份证号码不同ID2 – Cindy 2011-04-20 15:25:10

+0

@Cindy:请您发表您的表格定义吗? – Quassnoi 2011-04-20 15:27:39

+0

我调整了一下,并添加了T.id2 = q.id2,它现在可以工作 – Cindy 2011-04-20 15:29:16

0
select * from table where ID2 in (
    select ID2 from table where count(ID2) > 1) t 
order by ID2 
+0

这不会工作,因为我期待过滤它只有员工和前雇员 – Cindy 2011-04-20 15:34:21