【发布时间】:2013-10-09 15:40:42
【问题描述】:
我无法为这种情况创建适当的 sql 查询。我有 1 个存储 CATEGORY_ID 的表。
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"
谢谢!
【问题讨论】:
-
可能需要使用 NOT IN 子句
-
您考虑过使用 UNION ALL 吗?
-
也许我理解错了,但是如果您将 WHERE 更改为指向 cp.parent_cat_id="randomID" (查询父猫而不是猫),您的第一个查询不会起作用吗?此外,如果没有该猫的子记录(根据最终连接),则将省略父猫记录。只是几个想法 - 也许我误解了这个问题......
-
如果不详细查看@它,您可以使用 1/2 查询的视图,然后将视图重新加入第二条语句...这将简化它(也许您正在运行根据您使用的 SQL 版本进行外部连接限制,这可以解决这个问题...)
-
where 子句正在寻找与 CATEGORY_ID 匹配的 ITEM_ID。第一个查询的问题是所有父类别 ID 都不匹配。我会看看其他建议,看看它们是否有帮助!