我的数据库中有两个关于我的用户(图书管理员和学生)的登录详细信息的表我已将用户的详细信息分成两个单独的表tblUserLibrarian和tblUserStudent;一个是图书馆员,一个是学生。每个表中的主键是用户名或ID(LibrarianID和StudentID)。
表格大纲如下:
tblUserStudent
StudentID Password FirstName LastName
S1201235 pass3 Jane Smith
S1201289 pass5 Pass Word
S1202009 pass2 John Smith
tblUserLibrarian
LibrarianID Password
L1094565 pass4
L1202836 password123
L1202908 qwerty
L1212345 pass3
我遇到一个问题,当用户尝试使用他们的用户名(这是他们的ID)登录时。我想检查他们的用户名是否存在于任一表上,并返回用户名所在的表中的所有字段。目前我只能想到一种方法是做2个查询来检查这个,但我觉得这可以在一个查询中完成。我已经查找了JOINS和UNIONS,但我尝试过的所有东西似乎都不起作用。
我最近的询问是:
SELECT TOP 1 * FROM tblUserStudent,tblUserLibrarian
WHERE StudentID = "S1202836" OR LibrarianID = "S1202836"
但这会返回两个表中的行,我只想在输入的用户名存在的情况下从一个表中返回用户的详细信息。
我正在使用MS Access 2010来进行查询。
答案 0 :(得分:1)
您的表格结构不同。你可以做一个UNION ALL来对两个表进行查询,但只返回一些Librarians的信息:
SELECT TOP 1 *
FROM(
SELECT studentId AS userID, password, firstName, LastName
FROM tblUserStudent
WHERE StudentID = 'S1201235'
UNION ALL
SELECT LibrarianID,password, NULL, NULL
FROM tblUserLibrarian
WHERE LibrarianID = 'S1201235'
) a
sqlfiddle demo (sql server,但作为一个例子)
我在id的列中添加了一个别名,以显示userID而不是studentID,因为UNION从第一个SELECT中获取列名。
我也离开了TOP 1,但如果你的身份证是唯一的,那么你应该只收到一张,这是不相关的
答案 1 :(得分:0)
select StudentID,Password,FirstName,LastName from tblUserStudent where studentID='S1202836'
union
select LibrarianID,Password,null,null from tblUserLibrarian where LibrarianID='L1202836'
我不确定我是否理解你的要求,但似乎你想要一个联盟,而不是一个联接,而且由于你的图书管理员表的列数少于你的用户学生表,你必须填写空列以便列数匹配。