0

我有一个包含客户信息、订单等的数据库。我需要运行一个查询来返回所有未下订单的客户。

相关表:登录和订单

相关列:login.loginID、login.loginFirstName、login.loginLastName、login.loginEmailAddress AND orders.OrderuserID

所以本质上 - 在psuedocode中:比较表登录,在orders.OrderUserID下的orders表中的匹配列loginID。如果不存在匹配项(如未下订单),则输出用户的名字、姓氏和电子邮件地址。

我一直在绞尽脑汁,但对语言有一些真正的问题。当谈到 SQL 时,我是一个大时代的 N00B。

4

5 回答 5

2

基本上它看起来像这样:

      SELECT l.login_id
        FROM login l
   LEFT JOIN orders o
          ON l.login_id = o.login_id
       WHERE o.login_id IS NULL

关键是使用带有 WHERE ... IS NULL 条件的 LEFT JOIN。换句话说,您专门在表中查找login表中没有任何“扩展”信息的行orders

这只是一般性描述,但我希望它对您构建特定于您的案例的大查询的过程有所帮助。)

于 2012-06-15T15:12:26.617 回答
1
select loginFirstName, loginLastName, loginEmailAddress 
from login
where loginID not in
    (select distinct OrderuserID from orders)

您也可以使用左连接来做到这一点:

select loginFirstName, loginLastName, loginEmailAddress 
from login left join orders on loginID = OrderuserID 
where OrderuserID is null

不确定哪个会执行得更快;试试看。第一个更容易理解,恕我直言。

编辑:“选择不同”的意思是“向我返回该字段的唯一值集”。因此,第一个 SQL 中的子查询返回确实有订单的用户集(他们的 ID)。如果用户有多个订单,DISTINCT 会确保她的 ID 只返回一次。

于 2012-06-15T15:09:17.597 回答
0

这应该这样做:

select *
from login l
left join orders o on l.loginId = o.OrderuserID
where o.OrderuserID is null
于 2012-06-15T15:11:53.463 回答
0

尝试:

select login.loginFirstName, login.loginLastName, login.loginEmailAddress  
FROM login 
LEFT OUTER JOIN orders ON login.loginID = orders.OrderuserID 
WHERE orders.OrderuserID IS NULL;

或类似的东西。我怀疑新 SQL 用户的诀窍是 LEFT OUTER 连接。如果没有该说明符,如果第二个表中有匹配项,则连接只会返回第一个表中的行。这样您就可以全部获取它们(然后使用 IS NULL 短语过滤掉匹配项)。

于 2012-06-15T15:16:51.077 回答
0

虽然你应该先自己尝试,你可以先在谷歌上搜索:):)。
不管怎样,你可以这样使用它,

SELECT l.loginFirstName,l.loginLastName,
l.loginEmailAddress FROM login AS l LEFT JOIN orders as o 
ON l.loginID = o.OrderuserID where OrderuserID is NULL
于 2012-06-15T15:17:17.073 回答