我试图用一个子查询编写一个SELECT语句,该子查询确定客户的customer_id和last_name 其信用卡最快到期,如我的订单表中所示 并为此我想使用一个WHERE子句,但我卡住,因为结果只显示一个客户... 这是我到目前为止所拥有的。如果有人能指引我走正路......
SELECT customer_id, last_name
FROM customers
WHERE NOT EXISTS
(SELECT card_expires
FROM orders
WHERE customers.customer_id = orders.customer_id
);
答案 0 :(得分:1)
虽然我不清楚您的确切过滤或订购要求,但我想您可能希望从以下开始。
SELECT customer_id, last_name, card_expires
FROM customers
left join (
SELECT card_expires
FROM orders
) o on (customers.customer_id = orders.customer_id)
使用此方法,您可以看到所有客户和card_expires的完整列表,然后您就可以开始将列表过滤到您想要的内容。您可以在订单上构建子查询以选择特定的订单子集。我再一次不清楚你要做什么。但是,首先选择所有信息,您将能够看到所有信息,并能够决定过滤掉哪些信息。
您可能会决定从订单表中查看更多列,以帮助您确定要包含/排除的订单。
如果您只想查看没有card_expires条目的客户列表
SELECT customer_id, last_name, card_expires
FROM customers
left join (
SELECT card_expires
FROM orders
) o on (customers.customer_id = orders.customer_id)
where o.card_expires is null
如果您希望仅查看没有卡将来过期的客户。
SELECT customer_id, last_name, card_expires
FROM customers
left join (
SELECT card_expires
FROM orders
where card_expires > now()
) o on (customers.customer_id = orders.customer_id)
where o.card_expires is null
在制作SQL语句时,可以更容易做到的事情是FIRST创建一个SQL语句,它返回用于过滤列表的所有列,然后应用过滤器。这样您就可以更轻松地添加和删除标准,直到您正确使用它。
我喜欢将每个标准拆分到它自己的单独行,这样我就可以用两个破折号轻松地评论行。 EX:
SELECT customer_id, last_name, card_expires
FROM customers
left join (
SELECT card_expires
FROM orders
where card_expires > now()
) o on (customers.customer_id = orders.customer_id)
where 0=0
and o.card_expires is null
-- and last_name = 'Smith'
答案 1 :(得分:0)
使用LEFT JOIN / INNER JOIN,我假设你想要ORDER BY ASC,因为你想要最快
SELECT customer_id, last_name
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.customer_id
ORDER BY card_expires ASC;