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的可变数量(从用户的复选框中选择)。
在此先感谢。
对于给定的Material/ThicknessRange组合,是否保证在MaterialThicknessRange表中只有一个条目?
SELECT MaterialID, COUNT(MaterialID) As NumMaterialThicknesses
FROM MaterialThicknessRange
WHERE ThicknessRangeID IN (1, 2)
GROUP BY MaterialID
HAVING COUNT(MaterialID) > 1
是的,Material/ThicknessRange组合是唯一的。 – 2011-05-10 13:08:35
您是否尝试过查询?应该给你你想要的结果。关于使用IN的唯一一件事是你不能传递一个命名参数,所以你需要使用一个动态的SQL字符串或创建一个存储过程,它将一串ids作为参数并将其解析为查询(如mslliviu提及)。如果您使用动态字符串[例如“SELECT * FROM table WHERE x IN(”+ myVal +“)”]你需要注意sql注入。不要盲目接受应用程序的id值,首先验证它们是整数。 – Sam 2011-05-10 13:20:43
是的,查询按预期工作。非常感谢您的帮助。是的,我会对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
末
你能提供一些示例表中的值吗? – cmutt78 2011-05-10 12:55:42
产品编号:2产品说明\t Active PORON®4701-30测试说明Y – 2011-05-10 12:58:09
您对前端使用什么? Web窗体,桌面应用程序?什么语言? – JohnK813 2011-05-10 12:58:55