【问题标题】:select rows from table based on data from another table根据另一个表中的数据从表中选择行
【发布时间】:2014-01-01 19:51:39
【问题描述】:
Mentor table
------------
name (varchar)
contact (int)
english (boolean)
french (boolean)
german (boolean)


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


我想根据语言将导师与学生匹配,例如:

如果导师 1 懂英语和法语,他将匹配所有至少懂英语或法语的学生。

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 表也将有namecontact 等列。所以gridview 上的输出应该是每mentor 1 行。

【问题讨论】:

标签: asp.net sql sql-server vb.net select


【解决方案1】:
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

这里的好处是,如果您添加另一种语言,它纯粹是数据输入,无需更改表结构或您的代码,但这并不总是一种选择。

【讨论】:

  • 感谢您的建议,这是有道理的。但是我忘了提到mentor 表还有其他列,例如contactname,我也想显示这些列。
【解决方案2】:
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

【讨论】:

  • 修改了代码以适合我的实际数据库并且它可以工作。不知道 sql 存在 intersect。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-22
  • 2014-10-25
  • 2012-03-23
  • 1970-01-01
相关资源
最近更新 更多