Product(产品表)
id varchar(40)
pname varchar(80)
.....
orderlist(订单表)
id varchar(40)
productid varchar(40)-- 产品ID
createdate datetime
.....
我想取每个产品的详细信息(product.*) 和 最后一次订单创建时间(orderlist.createdate)
产品表与订单表的关系是一对多。 一条产品记录有多条订单记录
SELECT dbo.product.productid , dbo.product.price , ( SELECT COUNT(1) FROM dbo.orderlist WHERE ( dbo.product.productid = productid ) ) AS Total , ( SELECT SUM(ptotal) FROM dbo.orderlist WHERE ( dbo.product.productid = productid ) ) AS AllPrice FROM dbo.product INNER JOIN dbo.orderlist AS orderlist_1 ON orderlist_1.productid = dbo.product.productid WHERE orderlist_1.createtime BETWEEN DATEADD(d, -30, GETDATE()) AND GETDATE()
查询结果:
有很多重复记录。 怎样只保留一条记录?
这样怎么会有重复记录呢,你SQL没提供完整吧。
嗯, 现在完整了。
@奋奋奋: 你先想想你要啥吧。逻辑不清楚就不要写SQL语句了。
distinct 就是所有的字段要完全一样,包括id, createdate, name ...
你自己看看是不是每一行都有点儿不一样的东西。
@爱编程的大叔: 大叔赐教了,是我手打的。。。 我就是想产品表连订单表,order.createdate desc 最近一条的产品信息。
@奋奋奋: 那是用GROUP BY,不是用Distinct。
max(CreateDate)
@爱编程的大叔: 可以不用group by 么, 字段太多了。 我就是想取最近一条订单里的产品详细。
@奋奋奋: 需求不清楚,你把需求搞清楚再说吧。
我就是想取最近一条订单里的产品详细
这肯定不是完整的表述, 你要说出你想干啥,不要问一句你吐一点,这样好恶心。
@爱编程的大叔: 受教了,
SELECT product.id, orderlist.createdate,product.pname.... FROM Product INNER JOIN orderlist ON orderlist.pid=product.id
由于1个产品(Product)对应多对订单(Orderlist)记录,这样一连表,肯定就会很多重复。 我只想要一条就行。 该怎么写?
意思就是去重复,留一条
@奋奋奋: 你没说出需求啊。
到底你关心的是产品还是订单?不要用SQL语句,用普通话说。
比如,我想知道所有产品的信息,以及如果有订单,最新的订单日期信息。这样?
@爱编程的大叔: 大叔帮我再看看。
@奋奋奋: 不用别人帮。
SQL很简单,你只要不一次写好多事,分成几步,每一步都很简单。
1、Select distinct pid from orderlist_1 where orderlist_1.createtime BETWEEN DATEADD(d, -30, GETDATE()) AND GETDATE()
2、Select pid, ..... from products M innner join (上面那一串)M
on M.pid=N.pid
把一个复杂的事情简单化。
个人觉得,你应该先找到最近订单,然后再去连接产品。
select * (select *,rownum = row_number() over(partition by Orders.ProductId order by Orders.OrderDate desc) from Orders) t
where t.rownum = 1
以上是查询每个产品,最后一个订单的方式。然后连产品表即可。
@幻天芒: 帮我再看看
@奋奋奋: 如果是完全重复,那么可以简单的使用distinct搞定,当然效率低。
可惜已经有人回答了。