下面的SQL不返回任何结果,但表中有一条记录:
SELECT DISTINCT ul.* FROM UserLogin ul, ContactPerson cp, UserRole url, Role rl
如果我运行此查询,则返回记录:
SELECT DISTINCT ul.* FROM UserLogin ul
你能帮忙解释一下这个以及如何使第一个工作吗?
答案 0 :(得分:2)
答案 1 :(得分:2)
此:
SELECT distinct ul.*
FROM UserLogin ul
...有效,因为它是从单个表中选择的,而这个:
SELECT distinct ul.*
FROM UserLogin ul,
ContactPerson cp,
UserRole url,
Role rl
...正在使用非ANSI JOIN语法将USERLOGIN
,CONTACTPERSON
,USERROLE
和ROLE
表连接在一起。为了从查询中返回记录,必须在所有涉及的表中存在记录。为了使其可视化,它看起来像这样:
蓝色部分表示将从类似于您的查询返回的记录。
要从所有这些表中获取记录,我们必须知道它们之间的关系。
以下是使用ANSI连接语法的查询示例,包括有关表如何关联以便使查询返回结果的假设:
SELECT DISTINCT ul.*
FROM CONTACTPERSON cp
JOIN USERLOGIN ul ON ul.user_id = cp.user_id
JOIN USERROLE ur ON ur.user_id = ul.user_id
JOIN ROLE r ON r.role_id = ur.role_id
目前尚不清楚USERLOGIN和CONTACTPERSON之间的关系是什么......
我强烈建议您阅读此article on SQL JOINs。
建议使用ANSI JOIN语法 - 它更具可读性,将实际WHERE
子句条件与JOIN条件分开,并在各种数据库中受支持,使查询更容易移植。
答案 2 :(得分:1)
您需要加入所有表格ul,cp,url,rl。例如
SELECT distinct ul.* FROM UserLogin ul join ContactPerson cp
on ul.id=cp.user
答案 3 :(得分:1)
您的SELECT语句列出了4个表,并使用它们的笛卡尔积。
由于SELECT不返回任何行,因此其中一个表必须为空。
由于断言表UserLogin包含一行,因此其他三个表中至少有一个必须为空。