Oracle SQL:SQL与group by(count)连接并具有子句

Oracle SQL:SQL与group by(count)连接并具有子句,sql,oracle,group-by,having,Sql,Oracle,Group By,Having,我有三张桌子 表1。出售 表2。项目服务 表3。项目 表1和表2有共同的ID,表2和表3有共同的项 我有一个问题,我已经提出了迄今为止,但似乎无法得到它的权利 我正在尝试选择只有一行且符合特定条件的所有行这是我的查询: select * from sales i inner join itemssales j on i.id = j.id inner join item u on j.item = u.item where u.code = ANY ('TEST','HI') a

我有三张桌子

表1。出售 表2。项目服务 表3。项目

表1和表2有共同的ID,表2和表3有共同的项

我有一个问题,我已经提出了迄今为止,但似乎无法得到它的权利

我正在尝试选择只有一行且符合特定条件的所有行这是我的查询:

select *
from sales i
    inner join itemssales j on i.id = j.id
    inner join item u on j.item = u.item
where u.code = ANY ('TEST','HI') and
    i.created_date between TO_DATE('1/4/2016 12:00:00 AM','MM/DD/YYYY HH:MI:SS AM') and
    TO_DATE('1/4/2016 11:59:59 PM','MM/DD/YYYY HH:MI:SS PM')
group by i.id
having count(i.id) = 1
在ItemSale表中有两个条目,但在sale表中只有一个条目。这很好…但是我需要构造一个查询,它只返回给我一条记录

我认为问题在于任何部分,查询只返回一行,而该行是不符合任何“TEST”、“HI”条件的记录。 但实际上,具有该特定ID的记录在ItemSales中有两条记录

我只需要返回合法只有一条记录的记录

感谢您的帮助

--EDIT:


COL1 | ID
-----|-----
2    |  26
3    | 85
1    | 23
1    | 88
1    | 6
1    | 85
我还要对它们进行分组,确保计数等于1,但正如您所看到的,ID85在这里显示为一条记录,这是一个假阳性,因为itemsales表中实际上有两条记录

我甚至尝试在select之后将查询更改为j.id,因为j是包含两条记录的表,但没有go

--- EDIT

Sale table contains:
ID
---
85

Itemsales table contains:

ID | Position | item_id
---|----------|---------
85 |     1    |   6
85 |     2    |   7

Items table contains:

item_id | code
--------|------
   7    | HI
   6    | BOOP
它返回的记录是代码为“BOOP”的记录

谢谢

我只需要返回合法只有一条记录的记录

我的意思是,你只想退货一件商品。此外,您需要该项目以满足您的附加标准

这里有一种方法,它可以很好地处理少量数据,但可能无法很好地扩展。如果没有适当的表描述和数据配置文件,就不可能提供性能解决方案

with itmsal as    
            ( select sales.id 
              from itemsales
                    join sales on sales.id = itemsales.id 
              where sales.created_date >= date '2016-01-04'
              and sales.created_date < date '2016-01-05'
              group by sales.id having count(*) = 1)
select sales.*
       , item.*
from itmsal
     join sales on sales.id = itmsal.id
     join itemsales on itemsales.id = itmsal.id
     join items on itemsales.item = itemsales.item
where items.code in ('TEST','HI')

我认为您试图限制结果,以便项目只能有“TEST”或“HI”代码

select
     sales.*
from (
      select
          s.id
      from Sales s
          inner join Itemsales itss on s.id = itss.id
          inner join Items i on itss.item_id = i.item_id
      group by
          s.id
      where s.created_date >= date '2016-01-04'
          and s.created_date < date '2016-01-05'
      having
          sum(case when i.code IN('TEST','HI') then 0 else 1 end) = 0
     ) x
inner join sales on x.id = sales.id
... /* more here as required */
此构造仅返回sales.id,其中包含仅包含这两个代码的项


注意,可以使用公共表表达式CTE来完成,但我更喜欢仅在这样做有好处时使用这些表达式,我在这里没有看到这一点。

如果我正确获得它,则可能无法测试:

select *
from sales s
inner join (
   select i.id, count( i.id ) as cnt
   from sales i
   inner join itemssales j on i.id = j.id
   inner join item u on j.item = u.item and u.code IN ('TEST','HI')
   where i.created_date between TO_DATE('1/4/2016 12:00:00 AM','MM/DD/YYYY HH:MI:SS AM') and
TO_DATE('1/4/2016 11:59:59 PM','MM/DD/YYYY HH:MI:SS PM')
   group by i.id
) sj on s.id = sj.id and sj.cnt = 1

你能提供一个你目前获得的输出样本和你期望的结果吗?那么你想要的记录只有一种类型的代码吗?没错,但它不能在itemssales表中多次出现这是个诀窍,我认为上面的方法是行不通的。样本数据意味着所涉及的每个表的数据,你能提供一些请不要你现有的查询结果吗?基本上你要求的是只包含一个项目的所有销售?我认为你必须重新考虑你的问题。这确实令人困惑,可能会忽略相信、猜测的部分。说你试过的。您期望哪个输入有什么输出。