0

好的,标题很混乱,所以让我用一个例子来解释一下。

我的桌子:

id  ref  valid
---------------
1   PRO  true
1   OTH  true
2   PRO  true
2   OTH  false
3   PRO  true
4   OTH  true

这里的主键是 id 和 ref 的组合。

我想选择同时具有有效“PRO”参考和另一个有效参考的所有 id,在这种情况下它只会返回“1”。我不明白我怎么能做到这一点,IN 和 SELF JOIN 似乎不适合这个。

4

5 回答 5

3

这是一种方法,使用EXISTS

SELECT id
FROM Table1 a
WHERE ref = 'PRO'
AND EXISTS
(
    SELECT 1
    FROM Table1 b
    WHERE b.id = a.id
    AND b.ref <> 'PRO'
    AND b.valid = 'true'
)
于 2013-08-30T08:02:38.760 回答
0

使用join

SELECT t1.id
FROM Table1 t1 join Table1 t2 on 
t1.id = t2.id and t1.ref = 'PRO' and t2.ref <> 'PRO'
              and t1.valid= 'true' and t2.valid= 'true'
于 2013-08-30T08:09:04.333 回答
0

SELECT id FROM Table1 一个内连接(select id,count(*) count from table1 group by id)作为 temp.id=a.id 和 count>1 的 temp.ref='PRO'

于 2013-08-30T08:09:24.070 回答
0

这是我的解决方案:

SELECT   id
FROM     val
WHERE    valid='true'
GROUP BY id
HAVING
  COUNT(DISTINCT ref)>1
  AND COUNT(CASE WHEN ref='PRO' THEN ref END)>0

在此处查看小提琴。

于 2013-08-30T08:21:01.610 回答
0

您可以使用内部自连接、嵌套查询和一些分组来解决它:

SELECT A.*
FROM (
    SELECT id
    FROM test
    WHERE (ref = 'PRO') AND (valid = 'true')
) AS A
INNER JOIN (
    SELECT id
    FROM test
    WHERE valid = 'true'
    GROUP BY id
    HAVING (
    count( DISTINCT ref ) >1
    )
) AS B
ON A.id = B.id

A 子查询使用'PRO' ref 查询id 的表,B 组并查询表中至少有两个有效到true 的ref 的id。

于 2013-08-30T08:52:31.890 回答