Sql 查询内部连接表中的不同记录

Posted

技术标签:

【中文标题】Sql 查询内部连接表中的不同记录【英文标题】:Sql Query distinct records within inner joined tables 【发布时间】:2017-10-17 23:46:32 【问题描述】:

因此,我将几张桌子连接在一起,但遇到了一些问题。这是我的sql:

SELECT co.orderid,
       orderdate,
       emailaddr,
       city,
       weight,
       partdescription
FROM customer c
INNER JOIN custorder co ON c.customerid = co.customerid
INNER JOIN custorderline cl ON co.orderid = cl.orderid
INNER JOIN inventorypart i ON cl.partnumber = i.partnumber
WHERE orderdate BETWEEN to_date('2015/11/01', 'yyyy/mm/dd') AND to_date('2015/11/30', 'yyyy/mm/dd')
  AND emailaddr LIKE '%gmail%'
  OR emailaddr LIKE '%outlook%'
  AND categoryid IS NOT NULL
  AND weight > 30;

以下是一些结果:

ORDERID    ORDERDATE EMAILADDR                                          CITY                     WEIGHT PARTDESCRIPTION                                  
---------- --------- -------------------------------------------------- -------------------- ---------- --------------------------------------------------
2000000351 30-NOV-15 vacation@gmail.com                                 Walla Walla                  .5 MINI TOWER CASE                                   
2000000351 30-NOV-15 vacation@gmail.com                                 Walla Walla               34.44 EAGLE Z240 XEON E3                                
2000000354 01-DEC-15 jmuench@outlook.com                                Miami                     34.44 EAGLE Z240 XEON E3                                
2000000224 07-OCT-15 findwork@outlook.com                               Asheville                 34.44 EAGLE Z240 XEON E3                                
2000000279 01-NOV-15 analyzeh20@gmail.com                               Sumter                     .438 BOARD GAMES                                       
2000000279 01-NOV-15 analyzeh20@gmail.com                               Sumter                     .375 INTERNET SECURITY                                 
2000000298 08-NOV-15 mswatson@gmail.com                                 Ogden                     27.32 EAGLE PRETIEGE 9000                               
2000000311 12-NOV-15 syarian@gmail.com                                  Whales                       .5 2GB RADEON R7 350 VIDEO CARD                      
2000000316 16-NOV-15 mouse@gmail.com                                    Charleston                 .375 FLASH WING OPTICAL GAMING MOUSE                   
2000000320 17-NOV-15 jjones@gmail.com                                   Burns                      .188 HDMI MALE 180 DEG SWIVEL                          
2000000346 29-NOV-15 sign3@gmail.com                   

这就是我想要完成的。 11月的所有订单,邮件中包含gmail或outlook,零件号必须有categoryid,零件重量必须在30以上,orderid只出现一次。

我的问题是重量小于 30 的零件仍然出现,我需要以某种方式制作它,以便“如果订单出现多次;仅列出一次。”

这是一个让我很困惑的硬件问题......我已经玩了很长时间了,一直回到它并认为我只是想错了。任何帮助或见解将不胜感激!

【问题讨论】:

为什么相同的订单ID显示不同的城市和重量?哪一行是正确的? 【参考方案1】:

您需要在 WHERE 子句中添加方括号以正确处理“OR”逻辑。

select co.orderid, orderdate, emailaddr, city, weight, partdescription
  from customer c
 inner join custorder co on c.customerid = co.customerid
 inner join custorderline cl on co.orderid = cl.orderid
 inner join inventorypart i on cl.partnumber = i.partnumber
 where orderdate between to_date('2015/11/01', 'yyyy/mm/dd')
   and to_date('2015/11/30', 'yyyy/mm/dd')
   and ( emailaddr like '%gmail%' or emailaddr like '%outlook%' )
   and categoryid is not null
   and weight > 30;

此外,此查询不会获得晚于“2015/11/30 00:00”的订单,例如它不会捕获“2015/11/30 00:01”。 所以你需要在格式掩码中添加时间

...AND to_date('2015/11/30 23:59:59', 'yyyy/mm/dd hh24:mi:ss') 

或者代替 BETWEEN 使用

    orderdate >= to_date('2015/11/01', 'yyyy/mm/dd')
and orderdate < to_date('2015/12/01', 'yyyy/mm/dd')

【讨论】:

以上是关于Sql 查询内部连接表中的不同记录的主要内容,如果未能解决你的问题,请参考以下文章

mysql左连接右连接(查询两张表不同的数据)

sql连接查询

Oracle_SQL 连接和子查询

嵌套查询与连接查询的区别是啥

MS Access 2007 中的 SQL 内部连接

SQL左连接不包括左表中的所有记录