Here's something to start you off...-- You'll need to add this split function (Only run this part once).-- Function is a modified version of:-- http://weblogs.sqlteam.com/mladenp/archive/2007/05/22/60213.aspxCREATE FUNCTION dbo.Split(@data VARCHAR(MAX), @delimiter VARCHAR(5))RETURNS @t TABLE (data VARCHAR(MAX))ASBEGIN DECLARE @textXML XML; SELECT @textXML = CAST('<d>' + REPLACE(@data, @delimiter, '</d><d>') + '</d>' AS XML); INSERT INTO @t(data) SELECT T.split.value('.', 'nvarchar(max)') AS data FROM @textXML.nodes('/d') T(split) RETURNENDGO-- Start Creating dummy dataCREATE TABLE #FileColours ( FileID INT, ColourID INT)INSERT INTO #FileColours SELECT 1, 1UNION ALL SELECT 1, 2UNION ALL SELECT 1, 3UNION ALL SELECT 1, 4UNION ALL SELECT 2, 1UNION ALL SELECT 2, 2UNION ALL SELECT 3, 1UNION ALL SELECT 3, 2UNION ALL SELECT 4, 2UNION ALL SELECT 4, 4UNION ALL SELECT 5, 2UNION ALL SELECT 5, 3GO-- Start queryDECLARE @Search VARCHAR(50) SET @Search = '4, 2'DECLARE @Count INTDECLARE @SearchTmp TABLE (ColourID INT)INSERT INTO @SearchTmp SELECT CAST(Data AS INT)FROM dbo.Split(@Search, ',')-- Remember how many rows were populatedSET @Count = @@ROWCOUNTSELECT FileIDFROM #FileColours fINNER JOIN @SearchTmp t ON f.ColourID = t.ColourIDGROUP BY FileIDHAVING COUNT(*) = @CountGO-- Clean up.DROP TABLE #FileColours GOThere are 10 types of people in the world, those that understand binary, and those that don't.