SQL - 检查两个表上是否存在数据

时间:2013-12-08 19:44:44

标签: sql database ms-access ms-access-2010

我的数据库中有两个关于我的用户(图书管理员和学生)的登录详细信息的表我已将用户的详细信息分成两个单独的表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来进行查询。

2 个答案:

答案 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'

我不确定我是否理解你的要求,但似乎你想要一个联盟,而不是一个联接,而且由于你的图书管理员表的列数少于你的用户学生表,你必须填写空列以便列数匹配。