2013-12-13 11 views
2
Mentor table 
------------ 
name (varchar) 
contact (int) 
english (boolean) 
french (boolean) 
german (boolean) 


Student table 
------------- 
name (varchar) 
contact (int) 
english (boolean) 
french (boolean) 
german (boolean) 


Я хочу, чтобы соответствовать наставника с учеником на основе языков, таких, что, например:

выберите строки из таблицы, основанные на данных из другой таблицы

если mentor1 знает английский и французский, он будет соответствовать всем студентам, которые знают, по крайней мере, английский или французский.

mentor1 (english, french) 
------------------------- 
studentA (english); 
studentB (english, french); 
studentC (english, german); 
studentD (english, french, german) 


если mentor2 знают немецкий только, он будет сравниваться со всеми студентами, которые знают, по крайней мере, немецкий. студенты, которые соответствуют друг другу, могут знать больше, чем просто немецкий.

mentor2 (german) 
---------------- 
studentC (english, german) 
studentD (english, french, german) 



обычно я просто использовать связку из if then else, чтобы собрать воедино SQL строку, но я использую gridview для отображения данных, так что я не уверен, что я могу сделать.

примеры кодов и учебных пособий всегда приветствуются.


редактировать: забыл упомянуть, что mentor таблица также будет иметь столбцы, такие как name и contact. поэтому выход на gridview должен быть 1 строка на mentor.

+0

Я отредактировал ваше название. Пожалуйста, смотрите: «Если вопросы включают« теги »в их названиях?] (Http://meta.stackexchange.com/questions/19190/), где консенсус« нет, они не должны ». –

ответ

1
SELECT m.*, s.name 
FROM dbo.Mentor m 
JOIN dbo.Student s 
ON EXISTS 
(
    SELECT x.LanguageID 
    FROM  
    (
     SELECT 1 AS LanguageID WHERE s.english = 1 UNION ALL 
     SELECT 2 AS LanguageID WHERE s.french = 1 UNION ALL 
     SELECT 3 AS LanguageID WHERE s.german = 1 
    ) x 
    INTERSECT 
    SELECT y.LanguageID 
    FROM  
    (
     SELECT 1 AS LanguageID WHERE m.english = 1 UNION ALL 
     SELECT 2 AS LanguageID WHERE m.french = 1 UNION ALL 
     SELECT 3 AS LanguageID WHERE m.german = 1 
    ) y 
) 
ORDER BY m.name 
+1

изменил коды в соответствии с моим фактическим db, и он работает. не знали 'intersect' существуют для sql. большое спасибо. –

5
Select 
    m.MentorName 
    , m.Language 
    , s.StudentName 
from Mentor as m 
inner join Student as s 
on (m.English = 1 and m.English = s.English) 
    or (m.french = 1 and m.French = s.French) 
    or (m.German = 1 and m.German = s.German); 

Это было бы проще, если бы ваши таблицы структурированы без поля для каждого языка, но запись вместо

Table: Mentor(MentorName, Language) 
Rows: 
Mentor1 | English 
Mentor2 | Englisn 
Mentor2 | French 

Сделайте то же самое для студентов, а затем запрос:

Select 
    m.MentorName 
    , m.Language 
    , s.StudentName 

from Mentor as m 
inner join Student as s 
on m.Language = s.Language 

Преимущество здесь в том, что если вы добавляете другой язык, это чисто ввод данных и не нужно менять структуру таблицы или ваш код, но это не всегда вариант.

+0

THX для предложения, это имеет смысл. однако я забыл упомянуть, что таблица «mentor» также будет содержать другие столбцы, такие как «contact» и «name», которые я также хочу отобразить. –

Смежные вопросы