SQL:检索具有多个属性的唯一ID

问题描述:

好吧,我在描述这个时遇到了问题。我有: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

对于给定的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

我用这样的

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