2011-05-10 64 views
0

好吧,我在描述這個時遇到了問題。我有:SQL:檢索具有多個屬性的唯一ID

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

我想從MaterialThicknessRange表中檢索所有需要ThicknessRangeID的所有MaterialID。

例如,任何MaterialID with ThicknessRangeID 1 AND ThicknessRangeID 2等與ThicknessRangeID的可變數量(從用戶的複選框中選擇)。

在此先感謝。

+0

你能提供一些示例表中的值嗎? – cmutt78 2011-05-10 12:55:42

+0

產品編號:2產品說明\t Active PORON®4701-30測試說明Y – 2011-05-10 12:58:09

+0

您對前端使用什麼? Web窗體,桌面應用程序?什麼語言? – JohnK813 2011-05-10 12:58:55

回答

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組合是唯一的。 – 2011-05-10 13:08:35

+0

您是否嘗試過查詢?應該給你你想要的結果。關於使用IN的唯一一件事是你不能傳遞一個命名參數,所以你需要使用一個動態的SQL字符串或創建一個存儲過程,它將一串ids作爲參數並將其解析爲查詢(如mslliviu提及)。如果您使用動態字符串[例如「SELECT * FROM table WHERE x IN(」+ myVal +「)」]你需要注意sql注入。不要盲目接受應用程序的id值,首先驗證它們是整數。 – Sam 2011-05-10 13:20:43

+0

是的,查詢按預期工作。非常感謝您的幫助。是的,我會對int值進行額外檢查以確保它們有效防止注入。 – 2011-05-10 13:30:34

0

我用這樣的

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

其中dbo.TransformCSVToTable是用戶定義的函數爲CSV字符串轉換爲一列的表。貝婁這樣的功能的一個樣本

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