oracle SQL中的内部连接3个表

t1qtbnec  于 2023-06-22  发布在  Oracle
关注(0)|答案(3)|浏览(124)

我有三张table:订单、库存、状态

最终结果:
订单>> order_date = 2023-10-01 to 2023-10-30
status >> status_id = 2,3,5
股票>> keyuser,stock_loc
查询:

  1. select
  2. s.keyuser, o.order_date
  3. from
  4. stocks s
  5. inner join
  6. orders o on o.order_stock_id = s.stocks_id
  7. inner join
  8. status sta on sta.status_id = o.order_status_id
  9. where
  10. o.order_date <= date '2023-10-01'
  11. and o.order_date >= date '2023-10-30'
  12. and s.keyuser = 'kiki'
  13. and sta.status_id in (2, 3, 5)

结果:无输出

nwlls2ji

nwlls2ji1#

您的日期范围比较方式错误,KIKI应该大写以匹配您的数据:

  1. select s.keyuser,
  2. o.order_date
  3. from stocks s
  4. inner join orders o
  5. on o.order_stock_id = s.stocks_id
  6. inner join status sta
  7. on sta.status_id = o.order_status_id
  8. where o.order_date >= date '2023-10-01'
  9. and o.order_date < date '2023-10-31'
  10. and s.keyuser = 'KIKI'
  11. and sta.status_id in (2, 3, 5)
  • 注意:在Oracle中,DATE始终具有时间分量;许多客户端应用(即,SQL*Plus、SQL Developer等)使用DATE s的默认格式,该格式不显示时间组件,但即使不显示,它仍然存在。因此,如果您的order_date的时间部分不是午夜,则需要使用< DATE '2023-10-31'而不是<= DATE '2023-10-30',以便在最后一天获得完整的24小时范围。
ruoxqz4g

ruoxqz4g2#

  1. select order_date, keyuser, stock_loc
  2. from orders as o
  3. inner join status as s ON o.order_status_id = s.status_id
  4. inner join stocks as sk ON o.order_stock_id = sk.stocks_id
  5. where order_date >= DATE '2023-10-01' and order_date <= DATE '2023-10-30'
  6. and status_id in (2,3,5)
qzlgjiam

qzlgjiam3#

如果您不希望记录的日期既小于“2023 - 10 - 01”又大于“2023 - 10 - 31”,则日期比较不正确。此外,如果您希望它在关键用户比较中不区分大小写,则需要单独指定它。

  1. select
  2. s.keyuser, o.order_date
  3. from
  4. stocks s
  5. inner join
  6. orders o on o.order_stock_id = s.stocks_id
  7. inner join
  8. status sta on sta.status_id = o.order_status_id
  9. where
  10. o.order_date >= date '2023-10-01'
  11. and o.order_date <= date '2023-10-30'
  12. and s.keyuser = 'kiki' collate binary_ci
  13. and sta.status_id in (2, 3, 5)

相关问题