【问题标题】:SQL - Check if data exists on either tableSQL - 检查任一表上是否存在数据
【发布时间】:2013-12-25 19:49:07
【问题描述】:

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

【问题讨论】:

  • 不,它们只存在于任一表中,而不存在于两者中。 “S1202836”应该是一个变量,查询应该解释为“检查用户名是否存在于任一表中,而不是两者”
  • SELECT whatever FROM table1, table2 WHERE ... 真的有用吗?!

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


【解决方案1】:

您的表格结构不同。您可以执行 UNION ALL 来对两个表进行查询,但只为图书馆员返回一些信息:

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,但如果你的 ID 是唯一的,你应该只收到一个,这无关紧要

【讨论】:

  • 此查询似乎有效,谢谢。我添加了 TOP 1 因为我认为它只会返回 1 行,我的 ID 是唯一的。 FROM末尾的'a'是什么意思?
  • 是第一个FROM()里面查询的别名。每当您在 FROM 中使用这样的 SELECT 语句时,它都会被视为一个表,但它没有表名。 a 作为它的表名。
  • 啊,我在其他查询中看到过类似的语法,想知道这是为了什么。再次感谢您解决这个问题。
  • 您可以为每个表使用别名,但在大多数情况下,您这样做只是为了不多次写入表名。但在这种情况下,它是强制性的。
  • 为了澄清这一点,FROM() 中的查询将返回一个表,以便第一个 SELECT 可以从中获取所有信息?
【解决方案2】:
select StudentID,Password,FirstName,LastName from tblUserStudent where studentID='S1202836'
union
select LibrarianID,Password,null,null from tblUserLibrarian where LibrarianID='L1202836'

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-02
    • 2011-07-21
    • 1970-01-01
    • 1970-01-01
    • 2021-02-27
    • 1970-01-01
    相关资源
    最近更新 更多