2013-11-04 24 views
0

我有两个表格:ck_startupck_price。价格表包含列cu_type,prd_type,part_cd,qtydllrs。启动表通过ck_startup.prd_type_cd = ck_price.prd_type上的一对多关系链接到价格表。多个自连接加上一个内连接

价格表包含同一产品/零件/数量但在不同客户类型下的多个条目。并非所有客户类型都具有这三个值的相同独特组合。我试图创建一个查询,会做两两件事:

  1. 加入从ck_startup一些列到ck_price(描述,以及一些额外的价值)。
  2. ck_price加入自己,每个客户类型都有一个dllrs列。所以总的来说,我只有产品/零件/数量的每个唯一关键字的一个实例,以及每个客户价格列中的值(如果他们有一个)。

我从来没有使用自加入表格,到目前为止,我只能得到记录来显示两个客户都有相同的选项可用。

而且因为有人会要求我张贴的示例代码,这里是蹩脚的查询,这并不表明缺少价格:

select pa.*, pac.dllrs from ck_price pa 
join ck_price pac on pa.prd_type = pac.prd_type and pa.part_carbon_cd = pac.part_carbon_cd and pa.qty = pac.qty 
where pa.cu_type = 'A' and pac.cu_type = 'AC'; 

编辑:下面是来自这两个表的样本数据,以及如何我要他们看的时候我做:

 
CK_STARTUP 
+-----+-----------------+-------------+ 
| CD |  DSC  | PRD_TYPE_CD | 
+-----+-----------------+-------------+ 
| 3D | Stuff   | SKD3  | 
| DC | Different stuff | SKD   | 
| DN2 | Similar stuff | SKD   | 
+-----+-----------------+-------------+ 

CK_PRICE 
+---------+-------------+---------+-----+-------+ 
| CU_TYPE | PRD_TYPE_CD | PART_CD | QTY | DLLRS | 
+---------+-------------+---------+-----+-------+ 
| A  | SKD3  |  1 | 100 | 10 | 
| A  | SKD3  |  1 | 200 | 20 | 
| A  | SKD3  |  1 | 300 | 30 | 
| A  | SKD   |  1 | 100 | 50 | 
| A  | SKD   |  1 | 200 | 100 | 
| AC  | SKD3  |  1 | 300 | 30 | 
| AC  | SKD   |  1 | 100 | 100 | 
| AC  | SKD   |  1 | 200 | 200 | 
| AC  | SKD   |  1 | 300 | 300 | 
| AC  | SKD   |  1 | 400 | 400 | 
+---------+-------------+---------+-----+-------+ 

COMBO: 
+----+-----------------+---------+-----+---------+----------+ 
| CD |  DSC  | PART_CD | QTY | DLLRS_A | DLLRS_AC | 
+----+-----------------+---------+-----+---------+----------+ 
| 3D | Stuff   |  1 | 100 | 10  | null  | 
| 3D | Stuff   |  1 | 200 | 20  | null  | 
| 3D | Stuff   |  1 | 300 | 30  | 60  | 
| DC | Different stuff |  1 | 100 | 50  | 100  | 
| DC | Different stuff |  1 | 200 | 100  | 200  | 
| DC | Different stuff |  1 | 300 | null | 300  | 
| DC | Different stuff |  1 | 400 | null | 400  | 
+----+-----------------+---------+-----+---------+----------+ 
+0

Oracle是否有一个完整的外部联接? – HLGEM

+0

是的。从未使用它。编辑:切换此查询全外连接不会更改结果集。记录中'A'下有423条记录,'AC'下有384条记录。结果集是312条记录。 – Logarr

+0

尝试添加在哪里的条件上 – HLGEM

回答

1

好了,看看下面的查询和结果:

SELECT * 
FROM (SELECT 
      cs.cd, cs.dsc, cp.part_cd, cp.qty, cp.dllrs, cp.cu_type 
     FROM ck_startup cs 
      JOIN ck_price cp ON (cs.prd_type_cd = cp.prd_type_cd)) 
PIVOT (SUM(dllrs) AS dlllrs FOR (cu_type) IN ('A' AS a, 'AC' AS ac)) 
ORDER BY cd, qty 
; 

输出:

CD  DSC     PART_CD  QTY A_DLLLRS AC_DLLLRS 
-------- ----------------- ---------- ------- ---------- ---------- 
3D  Stuff      1  100   10    
3D  Stuff      1  200   20    
3D  Stuff      1  300   30   30 
DC  Different stuff   1  100   50   50 
DC  Different stuff   1  200  100  100 
DC  Different stuff   1  300     150 
DC  Different stuff   1  400     200 
DN2  Similar stuff    1  100   50   50 
DN2  Similar stuff    1  200  100  100 
DN2  Similar stuff    1  300     150 
DN2  Similar stuff    1  400     200

它不是你所期望的,因为我不明白为什么你在DLLRS_AC列是在CK_PRICE表中的值不同?例如,我的意思是,为什么在输出的最后一行中有400,而不是200?为什么这个值翻了一番(其他人在DLLRS_AC列)?

如果您使用的是Oracle 10g中,可以实现使用DECODEGROUP BY相同的结果,我们来看一看:

SELECT 
     cd, 
     dsc, 
     part_cd, 
     qty, 
     SUM(DECODE(cu_type, 'A', dllrs, NULL)) AS dllrs_a, 
     SUM(DECODE(cu_type, 'AC', dllrs, NULL)) AS dllrs_ac 
FROM (
    SELECT 
    cs.cd, cs.dsc, cp.part_cd, cp.qty, cp.dllrs, cp.cu_type 
    FROM ck_startup cs 
    JOIN ck_price cp ON (cs.prd_type_cd = cp.prd_type_cd) 
) 
GROUP BY cd, dsc, part_cd, qty 
ORDER BY cd, qty; 

结果是一样的。

如果您想了解更多关于回转,我由Tim厅推荐文章:Pivot and Unpivot at Oracle Base

+0

哎呀。我粘贴了错误的CK_PRICE表。我会解决这个问题。除此之外,似乎我正在使用Oracle 10g,所以我没有'pivot'功能...... – Logarr

+0

@Logarr我已经使用'DECODE'函数为10g添加了另一个解决方案,请查看并告诉我如果这将会为你工作。 –

+0

太棒了!我总是忘记你可以查询子查询的结果。我也没有太多关于'DECODE'功能的经验。非常感谢你! – Logarr