2013-10-09 132 views
1

我在为这种情况创建适当的sql查询时遇到了麻烦。我有1个表存储CATEGORY_ID的表。加入表的问题sql

p_xref 
+-------------+ 
| CATEGORY_ID | 
+-------------+ 
|  5005 | 
+-------------+ 

这CATEGORY_ID是父类,它可以有子类别ID。我在我的下一张桌上查看这个。对于此表中的每个CATEGORY_ID,都有一个PARENT_CAT_ID。如果该类别没有父项,则它设置为-1。我的查询当前查找PARENT_CAT_ID和第一个表中的CATEGORY_ID之间的匹配。

category_profile 
+-------------+---------------+ 
| CATEGORY_ID | PARENT_CAT_ID | 
+-------------+---------------+ 
|  5028 |   5005 | 
|  5005 |   -1 | 
+-------------+---------------+ 

然后,我将此类别ID与最终表匹配以获取ITEM_ID。

item_xref 
+-------------+---------+ 
| CATEGORY_ID | ITEM_ID | 
+-------------+---------+ 
|  5028 | 6767 | 
+-------------+---------+ 

我当前查询的问题是,它只抓取子类别,不适用于父类别。我可以做相反的事情,并匹配所有的父类别和没有子类别。无论如何要结合这两个查询?

查询1:抓斗子类别只

SELECT DISTINCT DATE FROM promotion p 
       LEFT JOIN p_xref pcx ON p.P_ID = pcx.P_ID 
       LEFT JOIN category_profile cp ON pcx.CATEGORY_ID = cp.PARENT_CAT_ID 
       LEFT JOIN item_xref icx ON cp.CATEGORY_ID = icx.CATEGORY_ID 
       WHERE icx.ITEM_ID = "randomID" 

查询2相匹配:抓斗父类只匹配

   SELECT DISTINCT DATE FROM promotion p 
       LEFT JOIN p_xref pcx ON p.P_ID = pcx.P_ID 
       LEFT JOIN item_xref icx ON pcx.CATEGORY_ID = icx.CATEGORY_ID 
       WHERE icx.ITEM_ID = "RandomID" 

谢谢!

+0

也许需要未使用条款 – Tony

+1

你有没有考虑过使用UNION ALL? –

+0

也许我误解了,但是如果您将WHERE更改为指向cp.parent_cat_id =“randomID”(查询父母的猫而不是猫),那么您的第一个查询不会工作吗?此外,如果没有该猫的子记录(每个最终连接),则会忽略父猫记录。只是一些想法 - 也许我误解了这个问题... –

回答

0

改变这一点:

LEFT JOIN category_profile cp ON pcx.CATEGORY_ID = cp.PARENT_CAT_ID 

这个

JOIN category_profile cp ON pcx.CATEGORY_ID = cp.PARENT_CAT_ID 
or pcx.category_id = cp.category_id 
+0

降级为简单的“加入”没有明确的左/右不是一个好主意 – zanlok

+0

,为什么会这样? –

+0

,因为它可能会混淆许多的期望关系:1或1:1。显式INNER和LEFT永远是明智的。将OPEF中的LEFT过分简化为INNER可能会省略必要的ro WS。 – zanlok

0

我将开始反转来获取在寻找不分项目,然后链接的其他方式。通过使用WHERE子句,可以将它强制为INNER连接和LEFT连接。 (无生产表列的列表中,但假定日期是从该表)

select distinct 
     p.Date 
    from 
     item_xref ixc 
     JOIN category_profile cp 
      on icx.category_id = cp.category_id 
      LEFT JOIN p_xref x1 
       on cp.category_id = x1.category_id 
       OR cp.parent_cat_id = x1.category_id 
       left join promotion p 
        on x1.category_id = p.p_id 
    where 
     icx.item_id = "randomid" 

上CATEGORY_ID上category_profile的ITEM_ID 指数确保item_xref表中的 指数