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」refと別の有効なrefの両方を持つすべてのIDを選択したいのですが、この場合、「1」のみが返されます。これを行う方法がわかりません。IN と SELF JOIN はこれには適していないようです。

4

5 に答える 5

3

を使用した 1 つの方法を次に示し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 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 グループは、有効から真の ref を持つ少なくとも 2 つの ref を持つ ID をテーブルにクエリします。

于 2013-08-30T08:52:31.890 に答える
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 に答える