2011-05-10 4 views
0

그래,이 문제를 설명하는 데 어려움이 있습니다. 나는이 : 내가 필요한 모든 ThicknessRangeID 년대에 맞는 MaterialThicknessRange 테이블의 모든 MaterialID 년대를 검색하려고SQL : 다중 특성을 가진 고유 ID 검색

material table (materialID, material, etc...) 
ThicknessRange table (ThicknessRangeID, ThicknessRange) 
MaterialThicknessRange table (MaterialID, ThicknessRangeID) 

.

예를 들어 사용자가 선택하는 ThicknessRangeID의 변수 번호가있는 MaterialID with ThicknessRangeID 1 AND ThicknessRangeID 2 등이 있습니다.

미리 감사드립니다.

+0

당신이 몇 가지 예제 테이블 값을하시기 바랍니다 제공 할 수 있습니까? – cmutt78

+0

ProductID : 2 제품 설명 \t 활성 PORON® 4701-30 테스트 설명 Y –

+0

프런트 엔드에는 무엇을 사용하고 있습니까? 웹 양식, 데스크탑 응용 프로그램? 어떤 언어? – JohnK813

답변

0

주어진 Material/ThicknessRange 조합에 대해 MaterialThicknessRange 테이블에 항목이 하나만 있어야합니까?

SELECT MaterialID, COUNT(MaterialID) As NumMaterialThicknesses 
FROM MaterialThicknessRange 
WHERE ThicknessRangeID IN (1, 2) 
GROUP BY MaterialID 
HAVING COUNT(MaterialID) > 1 
+0

예, Material/ThicknessRange 조합은 고유합니다. –

+0

검색어를 사용해 보셨습니까? 원하는 결과를 제공해야합니다. IN을 사용하는 것에 대해 짜증을내는 유일한 방법은 명명 된 매개 변수를 전달할 수 없으므로 동적 SQL 문자열을 사용하거나 매개 변수로 ID 문자열을 가져 와서 쿼리로 구문 분석하는 저장 프로 시저를 만들어야합니다. (mslliviu 언급처럼). 동적 문자열 [예 : "SELECT * FROM table WHERE x IN ("+ myVal + ")"] 당신은 SQL injection에 대해주의해야합니다. 앱에서 ID 값을 맹목적으로 받아들이지 않고, 먼저 정수인지 확인하십시오. – Sam

+0

예, 쿼리가 예상대로 작동했습니다. 귀하의 도움에 너무 감사드립니다. 예, int 값이 주입 방지를 위해 유효한지 추가 검사를합니다. –

0

나는 dbo.TransformCSVToTable는 하나 개의 컬럼 테이블에 CSV 문자열을 변환하는 사용자 정의 함수 인이

select MaterialID from MaterialThicknessRange MTR inner join 
dbo.TransformCSVToTable('1,2,15') IDs on MTR.ThiknessRangeID = IDs.ID 

같은 것을 사용하고 있습니다. 벨로는 같은 기능을 하나 개의 샘플

ALTER FUNCTION [dbo].[fn_IntegerParameterListFromString] 
( 
@IntegerParameterList varchar(max) 
) 
RETURNS @result TABLE (IntegerID int) 
AS 
begin 
declare @temp table (IntegerID int) 
declare @s varchar(max), @s1 varchar(10) 

declare @len int 
set @len =len(@IntegerParameterList) 
set @s = @IntegerParameterList 

if (right(@s,1)<>',') set @s = @s +',' 


while @s<>'' 
begin 
    set @s1 = substring(@s,1,charindex(',',@s)-1) 
    if (isnumeric(@s1)= 1) 
     insert @result (IntegerID) Values (Cast(@s1 as int)) 
if (CHARINDEX(',',@s)>0) 
    begin 
     set @s = substring (@s, charindex(',',@s)+1, @Len) 
    end 
    else 
    begin 
     if isnumeric(@s) = 1 
      insert @result (IntegerID) Values (Cast(@s as int)) 
     set @s = '' 
    end 
end 
return