2011-09-06 62 views
1

我有FF模式:如何在SQL Server中查詢這個?

學院

FacultyID    
Name     

標籤

TagID 
TagValue 

tags_faculty

TagID 
FacultyID 

問題是如何找出List<tags>中提供的任何TagValue的教師。 (請注意,由於一些DBA的設計,tagvalue不是唯一的,用戶在同一tagvalue,但tagid是不同的)

我使用SQL Server和LINQ的在C#。但是,只要結果是正確的,我就可以查詢,程序,linq表達式。

+0

你如何傳遞標籤列表?或者,這是真正的問題的要點(在這種情況下看[這裏](http://stackoverflow.com/questions/337704/parameterizing-a-sql-in-clause))? –

+0

我有一個標籤對象列表和一個提取標籤字符串列表。 – DucDigital

+0

你在使用哪種「LINQ」? LINQ to SQL? LINQ to Entities? –

回答

1

我會這樣做,作爲INNER JOIN

SELECT f.FacultyID, f.Name 
FROM faculty f 
INNER JOIN tags_faculty tf ON tf.FacultyID = f.FacultyID 
INNER JOIN tags t ON t.tagID = tf.tagID 
WHERE t.tagID IN (<list of tagID:s>) 
GROUP BY f.FacultyID 
0

如果我正確理解你的問題,那麼我認爲這個查詢應該可以幫助你。可能有點低效率的查詢,但是否這給你正在尋找的結果 -

select FacultyID, Name 
from faculty 
where facultyID in 
(select tf.FacultyID from tags_faculty tf 
    inner join tags t 
    on t.tagID = tf.tagID 
    where t.tagValue in (<your tag value list>) 
) 

也許額外DISTINCT條款也會有所幫助。

0
SELECT 
    * 
FROM 
    faculty 
WHERE 
    EXISTS (
    SELECT 
     * 
    FROM 
     tags_faculty 
    WHERE 
     TagID IN (SELECT TagID FROM tags WHERE TagValue IN (<your list of tag values>)) 
     AND FacultyID = faculty.FacultyID 
) 

關於如何實現標記值列表有很多選項。

您可以將查詢作爲字符串生成,然後將標籤推入自己。但是你需要小心注入攻擊等等。

或者你也許會生成一個單一的字符串,並且所有的標籤都被,分開,然後使用一個函數將它分成一個值表。 (SO和其他來源有許多這樣的功能。)

1

請嘗試以下LINQ to SQL其中TagsToMatch是您的內存字符串列表中。

List<int> TagsToMatch = tags.Select(tag => TagID); 
var matchingFaculty = 
    from facultyTag in dc.FacultyTags 
    where TagsToMatch.Contains(facultyTag.TagID) 
    select facultyTag.Faculty; 

如果您使用的是EF 4,則應該將您的M-M關係合併,以便將其更改爲以下內容。 EF 1不支持Contains語法。

var matchingFaculty = 
    from tag in dc.Faculties 
    where !TagsToMatch.Contains(tag.TagID) 
    from faculty in tag.Faculties 
    select faculty; 

無論哪種方式,您可能希望在在教職員工都匹配的多個標籤的情況下,最終以使用DISTINCT子句。