SQL选择没有结果

时间:2009-11-17 05:49:25

标签: sql

下面的SQL不返回任何结果,但表中有一条记录:

SELECT DISTINCT ul.* FROM UserLogin ul, ContactPerson cp, UserRole url, Role rl

如果我运行此查询,则返回记录:

SELECT DISTINCT ul.* FROM UserLogin ul

你能帮忙解释一下这个以及如何使第一个工作吗?

4 个答案:

答案 0 :(得分:2)

因为你从4个不同的表中拉出来:

用户登陆 联系人 UserRole的 作用

您需要UNION全部或JOIN,否则大部分时间都会返回空白。

答案 1 :(得分:2)

此:

SELECT distinct ul.* 
  FROM UserLogin ul

...有效,因为它是从单个表中选择的,而这个:

SELECT distinct ul.* 
  FROM UserLogin ul,
       ContactPerson cp,
       UserRole url,
       Role rl

...正在使用非ANSI JOIN语法将USERLOGINCONTACTPERSONUSERROLEROLE表连接在一起。为了从查询中返回记录,必须在所有涉及的表中存在记录。为了使其可视化,它看起来像这样:

alt text

蓝色部分表示将从类似于您的查询返回的记录。

要从所有这些表中获取记录,我们必须知道它们之间的关系。

以下是使用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与非ANSI JOIN语法

建议使用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包含一行,因此其他三个表中至少有一个必须为空。