我有一个包含客户信息,订单等的数据库。我需要运行一个查询,返回所有尚未下订单的客户。
相关表格:登录和订单
相关列:login.loginID,login.loginFirstName,login.loginLastName,login.loginEmailAddress AND orders.OrderuserID
所以基本上 - 在psuedocode中:比较表登录,在orders.OrderUserID下的orders表中匹配的列loginID。如果不存在匹配(如未放置任何订单),则输出用户的名字,姓氏和电子邮件地址。
我一直在绞尽脑汁,但对语言有一些实际问题。在谈到SQL时,我是N00B的重要时刻。
答案 0 :(得分: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
关键是使用LEFT JOIN和WHERE ... IS NULL条件。换句话说,您专门在login
表中查找orders
表中没有“扩展”信息的行。
这只是一般性描述,但我希望它对您构建特定于您的案例的大查询的过程有所帮助。 )
答案 1 :(得分: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只返回一次。
答案 2 :(得分:0)
这应该这样做:
select *
from login l
left join orders o on l.loginId = o.OrderuserID
where o.OrderuserID is null
答案 3 :(得分: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短语过滤掉匹配)。
答案 4 :(得分: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