1

select ステートメントの条件について簡単な質問があります。

次の項目を含む次の表があります。取得する必要があるのは、両方のタイプ ID に一致するオブジェクト ID です。

TypeId  ObjectId
1       10
2       10
1       11

したがって、タイプ ID 1 と 2 に一致するオブジェクト 10 の両方を取得する必要があります。

SELECT ObjectId
FROM Table
WHERE TypeId = 1
AND TypeId = 2

同じ行の両方の条件に一致しないため、明らかにこれは機能しません。このクエリを実行するにはどうすればよいですか? また、結果を絞り込むために 2 つ以上のタイプ ID を渡す場合があることにも注意してください。

4

4 に答える 4

5

自己結合:

SELECT t1.ObjectId 
FROM Table AS t1
INNER JOIN Table AS t2
    ON t1.ObjectId = t2.ObjectId
    AND t1.TypeId = 1 
    AND t2.TypeId = 2 

値を渡すときに動作をどのように機能させたいかを確認してください。ただし、それが始まりです。

于 2009-12-18T18:36:00.647 に答える
3

@Cade Roux からの回答に賛成票を投じました。それが私のやり方です。

しかし、FWIW、ここに別の解決策があります:

SELECT ObjectId
FROM Table
WHERE TypeId IN (1, 2)
GROUP BY ObjectId
HAVING COUNT(*) = 2;

TypeId、に対する一意性を仮定しObjectIdます。


TypeId3 つ以上の値を検索する必要があるかもしれないという @Josh からのコメントを参照してください。

使用するソリューションJOINでは、検索している値ごとに結合が必要です。検索する値の数が増えていることに気付いた場合は、上記のソリューションを使用GROUP BYする方が簡単かもしれません。

于 2009-12-18T18:49:53.973 に答える
1

このコードは、Oracle を念頭に置いて書かれています。他のフレーバーの SQL に対して十分に一般的である必要があります。

select t1.ObjectId from Table t1
join Table t2 on t2.TypeId = 2 and t1.ObjectId = t2.ObjectId
where t1.TypeId = 1;

TypeId を追加するには、別の結合を追加するだけです。

select t1.ObjectId from Table t1
join Table t2 on t2.TypeId = 2 and t1.ObjectId = t2.ObjectId
join Table t3 on t3.TypeId = 3 and t1.ObjectId = t3.ObjectId
join Table t4 on t4.TypeId = 4 and t1.ObjectId = t4.ObjectId
where t1.TypeId = 1;

重要な注意: 結合を追加すると、パフォーマンスが大幅に低下します。

ビルの答えに関しては、次のように変更して、一意性を想定する必要をなくすことができます。

SELECT ObjectId
FROM (SELECT distinct ObjectId, TypeId from Table)
WHERE TypeId IN (1, 2)
GROUP BY ObjectId
HAVING COUNT(*) = 2;

彼のやり方は、型の数が増えるにつれて、よりうまくスケールします。

于 2009-12-18T18:34:44.627 に答える
0

これを試して

サンプル入力:(ケース 1)

declare @t table(Typeid int,ObjectId int)
insert into @t 
    select 1,10 union all select 2,10  union all    
    select 1,11 
select * from @t 

サンプル入力:(ケース 2)

declare @t table(Typeid int,ObjectId int)
insert into @t 
    select 1,10 union all select 2,10  union all 
    select 3,10 union all select 4,10  union all 
    select 5,10 union all select 6,10  union all 
    select 1,11 union all select 2,11  union all 
    select 3,11 union all select 4,11  union all 
    select 5,11 union all select 1,12  union all 
    select 2,12  union all select 3,12 union all 
    select 4,12  union all select 5,12 union all 
    select 6,12  
select * from @t

入力例:(ケース 3)[重複したエントリがあります]

declare @t table(Typeid int,ObjectId int)
insert into @t 
    select 1,10 union all select 2,10  union all 
    select 1,10 union all select 2,10 union all
    select 3,10 union all select 4,10  union all 
    select 5,10 union all select 6,10  union all 
    select 1,11 union all select 2,11  union all 
    select 3,11 union all select 4,11  union all 
    select 5,11 union all select 1,12  union all 
    select 2,12  union all select 3,12 union all 
    select 4,12  union all select 5,12 union all 
    select 6,12  union all select 3,12 

ケース 1 の場合、出力は 10 になります。

ケース 2 と 3 の場合、出力は 10 と 12 になります。

クエリ:

select X.ObjectId from 
(
select 
            T.ObjectId
            ,count(ObjectId) cnt
from(select distinct ObjectId,Typeid from @t)T
where T.Typeid in(select Typeid from @t)
group by T.ObjectId )X
join (select max(Typeid) maxcnt from @t)Y
on X.cnt = Y.maxcnt
于 2009-12-19T03:56:20.537 に答える