如何查找订购所有文章的所有客户

时间:2016-01-14 21:27:22

标签: sql oracle

我的模型看起来像这样:

enter image description here

我希望找到订购所有文章的所有客户。

我不知道我该怎么做!我试过这样但是没有帮助:

 select distinct k.knr 
 from kunde_tab k 
 where ref(k) in (
                 select ref(k) 
                 from bestellung_tab b,
                      bestelldetails_tab bd 
                 where bd.bestellung=ref(b) 
                   and bd.artikel in (select ref(ar) from artikel_tab ar)
                 );

翻译:

Kunde = Customer
Auftrag = Order
Teil= Articel

4 个答案:

答案 0 :(得分:0)

无法判断您的引用的方式,但如果您的表格类似于:

客户 [id,name]

订单 [id,customerId,orderName,articleId]

文章 [id,articleName]

然后你可以进行加入:

select * from customer
join order on customerId = customer.id
join article on articleId = article.id
祝你好运。

答案 1 :(得分:0)

<强>未测试: 我无法理解桌子上的表现形式 我假设

  1. kunde.knr在auftrag上作为knr
  2. teail.nr on auftrag as nr
  3. 所以:首先我生成一个内联视图z来简单地返回所有文章的计数

    我们加入teil到auftrag作为左连接,以确保列出所有文章并让所有客户订购文章。 (部分或全部)

    通过使用having子句,我们确保他们订购的文章的不同数量与所有文章的数量相匹配。

    SELECT O.KNR, count(Distinct O.NR)
    FROM  teil A
    LEFT JOIN  Auftrag O
     on A.NR = O.NR
    CROSS JOIN (Select count(distinct NR) cnt  from teil) z --always returns 1 record
    GROUP BY O.KNR
    HAVING count(Distinct o.nr) = z.cnt
    

    逻辑上:

    得到一个DISTINCT!客户订购的所有商品的数量。 将该计数与所有文章的计数进行比较。如果匹配,则返回客户,如果没有,则不为客户返回任何内容。

答案 2 :(得分:0)

看看是否有效:

select k.KNr, a.ANr
from Kunde k
inner join Auftrag a
    on k.KNr = a.KNr
cross apply
(select distinct Nr from Teil) t
where t.Nr = a.Nr
group by KNr
having count(a.KNr) = (select count(distinct Nr) ctn from Teil)

答案 3 :(得分:0)

我明白了。这是解决方案:

WITH CTE AS
(
 select ac.am, count(ac.am) as cou 
   from ( select k.knr as am ,t.refteil.bezeichnung,  
   count(t.refteil.teilenummer) from kunden k,table(k.auftraege) auf,
   table(auf.positionen) t 
   group by t.refteil.bezeichnung,k.knr) ac 
 group by ac.am 
)
select am from (select * from  cte) 
  where cou =(select count(t.teilenummer) as coun 
  from Teile t);