2016-05-09 6 views
0

を一覧表示することは、これを気に入っています。それ、どうやったら出来るの?は、私は車でリストを持って、SQL Serverのテーブルから複数の行を取得し、それらに

私はこの関数を挿入しています

SET ANSI_NULLS ON 
GO 

SET QUOTED_IDENTIFIER ON 
GO 

CREATE FUNCTION [dbo].[SplitString] 
     (@pString NVARCHAR(4000), @pDelimiter NCHAR(1)) 
RETURNS TABLE WITH SCHEMABINDING AS 
RETURN 
    WITH E1(N) AS (
       SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL 
       SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL 
       SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 
       ),       --10E+1 or 10 rows 
     E2(N) AS (SELECT 1 FROM E1 a, E1 b), --10E+2 or 100 rows 
     E4(N) AS (SELECT 1 FROM E2 a, E2 b), --10E+4 or 10,000 rows max 
cteTally(N) AS (--==== This provides the "base" CTE and limits the number of rows right up front 
        -- for both a performance gain and prevention of accidental "overruns" 
       SELECT TOP (ISNULL(DATALENGTH(@pString),0)) ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E4 
       ), 
cteStart(N1) AS (--==== This returns N+1 (starting position of each "element" just once for each delimiter) 
       SELECT 1 UNION ALL 
       SELECT t.N+1 FROM cteTally t WHERE SUBSTRING(@pString,t.N,1) = @pDelimiter 
       ), 
cteLen(N1,L1) AS(--==== Return start and length (for use in substring) 
       SELECT s.N1, 
         ISNULL(NULLIF(CHARINDEX(@pDelimiter,@pString,s.N1),0)-s.N1,8000) 
        FROM cteStart s 
       ) 
--===== Do the actual split. The ISNULL/NULLIF combo handles the length for the final element when no delimiter is found. 
SELECT ItemNumber = ROW_NUMBER() OVER(ORDER BY l.N1), 
     Item  = SUBSTRING(@pString, l.N1, l.L1) 
    FROM cteLen l 
    WHERE SUBSTRING(@pString, l.N1, l.L1) <> '' 
; 
GO 

と、このストアドプロシージャを作成:

Alter Procedure [db_ddladmin].[spGetVehicles] 
(
    @ECU nvarchar(20), 
    @Identifiers nvarchar(20) 
) 
AS 
Begin 
    SELECT * 
    FROM db_ddladmin.View_VehicleReadouts 
    WHERE ECU IN (SELECT Item FROM [dbo].[SplitString](@ECU,',')) 
     AND Identifier IN (SELECT Item FROM [dbo].[SplitString](@Identifiers, ',')) 
END 

をそして、私はこのクエリによって、このストアドプロシージャを実行します。

EXEC [db_ddladmin].[spGetVehicles] @ECU = 'EBS7,ALM1', @Identifiers = '88' 

私が手それらのECUと識別子を含むすべての車両のリスト。しかし、私がそこに書いたECUの両方を持っている車両を表示したいだけで、それらのECUのうちの1つしか持っていない車両は表示したくないということです。それ、どうやったら出来るの?

+0

「車両」という列はありません。車両を特定するものは何ですか? –

+0

車両にはさまざまなECUが含まれています。これらの異なるECUは、88,89などの異なる番号を使用して識別できます。上記の図に示すように、車両には常に名前(この場合は「aamir」)があります。 Aamirには、各ECUが5つの異なる識別子を持つ約20種類のECUが含まれています。 –

答えて

1

アグリゲーションとhavingでこれを行うことができます。

with items(item) as (
     select Item 
     from dbo.SplitString(@ECU, ',') 
    ) 
select ?? 
from db_ddladmin.View_VehicleReadouts 
where ecu in (select items.item from items) 
group by ?? 
having count(*) = (select count(*) from items); 

??が車両を指定する列を表します。アイデアは、一致の数を数えることです。

テーブルに重複がある場合は、having句のcount(*)ではなく、count(distinct ecu)を使用してください。

+0

ありがとうございます。私はちょっと混乱している。 '?'は車両を指定しています。私はその部分をかなり理解していません。 –

+0

あなたが挿入した名前を使ってみましたか?それは私に同じ結果を与える。それはECUの1つを持っていて、他のものを持っていない車両を示しています。また、重複した値を表示します。@Gordon –

+0

'count(distinct ecu)'を使うと、返された値はすべてのアイテムを持つ必要があります。 –

関連する問題