2017-05-18 6 views
0

私はテーブルbawe_servicesを持っています。私はフィールドリスト内のすべてのレコードを照合するクエリ

id | Service_id |bawe_id 
1  2   2 
2  3   3 
3  2   3 

私はサービス= 2を渡した場合、私はサービスを渡すと、私はのservice_id = 2のすべてのレコードが必要= 1,2,3を持っているように与えられたキーで

に一致するすべてのデータを取得したいです1つのサービスがどのようなbaweによっても与えられていないので、私は0行を必要とします。私は0行を得た。

私は、クエリの最後の数( "3" この場合)事前

+2

コードを表示します。 – DigiFriend

+0

サービスで2以外の行数とテーブルのどの列が必要ですか?あなたがサンプルを含む場合は最高です。期待される出力。 –

+1

OPはすべての一致する行を表示したいと思いますが、私たちが提供するすべてのサービスIDに対して 'service_id'が存在する必要があります。 '2,3'を指定すると' 1,2,3'や '2,3,4'と' 1'や '4'が存在しないので、与えられたテーブルからすべてを返すべきです。 'service_id'カラム。 – Susang

答えて

2

パラメータの数を「中」文である等しい数と一致する必要があります。

select bawe_id from [dbo].[aspnet_bawe_services] 
where Service_id in (2) 
group by bawe_id 
having count(Service_id)=1; 

bawe_id 
----------- 
2 
3 

select bawe_id from [dbo].[aspnet_bawe_services] 
where Service_id in (2,3) 
group by bawe_id 
having count(Service_id)=2; 

bawe_id 
----------- 
3 

select bawe_id from [dbo].[aspnet_bawe_services] 
where Service_id in (1,2,3) 
group by bawe_id 
having count(Service_id)=3; 

bawe_id 
----------- 

(0 row(s) affected) 
+0

Thanx @Bernd Ottが明確な仕様です。これは他の開発者にも役立つことを願っています。あなたの努力を感謝します+1。 –

0
select * from aspnet_bawe_services 
where Service_id in (1,2,3) 
and 
(select count(distinct Service_id) from aspnet_bawe_services where Service_id in (1,2,3)) = 3 

にこのクエリ

select * from aspnet_bawe_services where ser_id in(1,2,3) 

ありがとうを使用する要素は、あなたがINリストに持っている、カウントされます。

0

あなたがgroup byhavingを使用したいサービスIDを取得することができます。

select service_id 
from t 
where bawe_id in (1, 2, 3) 
group by service_id 
having count(distinct bawe_id) = 3; 

は「= 3は」IN、リスト内のIDの数です。

その後、完全なレコードを取得するためにinまたはjoinまたはexistsを使用することができます。

select t.* 
from t 
where t.service_id in (select service_id 
         from t 
         where bawe_id in (1, 2, 3) 
         group by service_id 
         having count(distinct bawe_id) = 3 
        ); 
+0

提供されたサービスIDが正確に '3'に等しくない場合や、 '1,2以上の場合' 'count(distinct bawe_id)= 3'を変更する必要がありますか? – Susang

+0

ここで何をしているのかわからない –

1

TRYはTHIS:それは本当に退屈が、ユニークな要件だと、私はこれを達成するために考えて、私たちは

1-機能がへのservice_id

2-機能の明確な数を返す関数を使用する必要がありますカンマ区切りの値を分割してテーブル形式で返す

- ファンクションはservice_idの別個のカウントを返します

からコピー
CREATE FUNCTION [dbo].[getCount](@service_id varchar(500)) 
RETURNS INT    
AS  
BEGIN 
    DECLARE @count int 

    SELECT @count = COUNT(DISTINCT(t.service_id)) 
    FROM tmptos t 
    INNER JOIN [dbo].[SplitValue](@service_id, ',') tt on t.service_id = tt.items 

RETURN @count 
END; 
表形式で

--functionカンマ区切り値を分割して返すように --function - separate comma separated values and store in table in sql server

CREATE FUNCTION [dbo].[SplitValue](@String varchar(MAX), @Delimiter char(1))  
RETURNS @temptable TABLE (items VARCHAR(MAX))  
AS  
BEGIN  
    DECLARE @idx int  
    DECLARE @slice varchar(8000)  

    SELECT @idx = 1  
     if len(@String)<1 or @String is null return  

    WHILE @idx!= 0  
    BEGIN  
     set @idx = charindex(@Delimiter,@String)  
     IF @idx!=0  
      set @slice = left(@String,@idx - 1)  
     else  
      set @slice = @String  

     IF(LEN(@slice)>0) 
      INSERT INTO @temptable(Items) values(@slice)  

     SET @String = right(@String,len(@String) - @idx)  
     IF LEN(@String) = 0 break  
    END 
RETURN 
END; 

--Table with Sample Data 

create table tmptos(id int, Service_id int, bawe_id int) 
insert into tmptos values 
(1,  2,   2), 
(2,  3,   3), 
(3,  2,   3) 


declare @service_id varchar(50) = '2,3' 

select * 
from tmptos t 
inner join [dbo].[SplitValue](@service_id, ',') tt on t.Service_id = tt.items 
where [dbo].[getCount](@service_id) = (select count(distinct(items)) from [dbo].[SplitValue](@service_id, ',')) 

OUTPUT:

id Service_id bawe_id items 
1 2   2  2 
2 3   3  3 
3 2   3  2 

それは少し長いですが、完璧に動作します。

+0

私はあなたの努力に投票しましたが、@Bernd Ottの答えは私のために働いたと思っています。私はそれも簡単だと思います。 –

関連する問題