首页 新闻 会员 周边 捐助

sql 08 多表连接查询,如何排除重复?

0
悬赏园豆:20 [已解决问题] 解决于 2015-05-06 10:44

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()

 

查询结果: 

有很多重复记录。 怎样只保留一条记录?

 

奋奋奋的主页 奋奋奋 | 初学一级 | 园豆:32
提问于:2015-04-09 11:49
< >
分享
最佳答案
0

这样怎么会有重复记录呢,你SQL没提供完整吧。

收获园豆:14
爱编程的大叔 | 高人七级 |园豆:30844 | 2015-04-09 11:52

嗯, 现在完整了。

奋奋奋 | 园豆:32 (初学一级) | 2015-04-09 11:55

@奋奋奋: 你先想想你要啥吧。逻辑不清楚就不要写SQL语句了。

distinct 就是所有的字段要完全一样,包括id, createdate, name ...

你自己看看是不是每一行都有点儿不一样的东西。

爱编程的大叔 | 园豆:30844 (高人七级) | 2015-04-09 11:58

@爱编程的大叔:  大叔赐教了,是我手打的。。。 我就是想产品表连订单表,order.createdate  desc 最近一条的产品信息。 

 

奋奋奋 | 园豆:32 (初学一级) | 2015-04-09 12:02

@奋奋奋: 那是用GROUP BY,不是用Distinct。

max(CreateDate)

爱编程的大叔 | 园豆:30844 (高人七级) | 2015-04-09 12:03

@爱编程的大叔: 可以不用group by 么, 字段太多了。 我就是想取最近一条订单里的产品详细。

奋奋奋 | 园豆:32 (初学一级) | 2015-04-09 12:32

@奋奋奋: 需求不清楚,你把需求搞清楚再说吧。

 

我就是想取最近一条订单里的产品详细

这肯定不是完整的表述, 你要说出你想干啥,不要问一句你吐一点,这样好恶心。

爱编程的大叔 | 园豆:30844 (高人七级) | 2015-04-09 12:34

@爱编程的大叔:  受教了, 

 SELECT  product.id,  orderlist.createdate,product.pname.... FROM Product INNER JOIN   orderlist ON  orderlist.pid=product.id    

由于1个产品(Product)对应多对订单(Orderlist)记录,这样一连表,肯定就会很多重复。  我只想要一条就行。 该怎么写?

意思就是去重复,留一条

奋奋奋 | 园豆:32 (初学一级) | 2015-04-09 13:00

@奋奋奋: 你没说出需求啊。

到底你关心的是产品还是订单?不要用SQL语句,用普通话说。

比如,我想知道所有产品的信息,以及如果有订单,最新的订单日期信息。这样?

爱编程的大叔 | 园豆:30844 (高人七级) | 2015-04-09 13:20

@爱编程的大叔: 大叔帮我再看看。 

奋奋奋 | 园豆:32 (初学一级) | 2015-04-09 14:12

@奋奋奋: 不用别人帮。

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

 

把一个复杂的事情简单化。

爱编程的大叔 | 园豆:30844 (高人七级) | 2015-04-09 17:29
其他回答(2)
0

个人觉得,你应该先找到最近订单,然后再去连接产品。

收获园豆:5
幻天芒 | 园豆:37207 (高人七级) | 2015-04-09 13:22

select * (select *,rownum = row_number() over(partition by Orders.ProductId order by Orders.OrderDate desc) from Orders) t
where t.rownum = 1

以上是查询每个产品,最后一个订单的方式。然后连产品表即可。

支持(0) 反对(0) 幻天芒 | 园豆:37207 (高人七级) | 2015-04-09 13:29

@幻天芒: 帮我再看看

支持(0) 反对(0) 奋奋奋 | 园豆:32 (初学一级) | 2015-04-09 14:12

@奋奋奋: 如果是完全重复,那么可以简单的使用distinct搞定,当然效率低。

支持(0) 反对(0) 幻天芒 | 园豆:37207 (高人七级) | 2015-04-09 17:07
0

可惜已经有人回答了。

收获园豆:1
Firen | 园豆:5385 (大侠五级) | 2015-04-09 16:52
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册