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 查询内部连接表中的不同记录的主要内容,如果未能解决你的问题,请参考以下文章