我有3个表:成员,产品,product_costs
我需要将这些表中的信息合并到一个表中。当我这样做时,我得到了太多结果,我不知道为什么。
对于每种产品,应该有成本,但可能没有。如果有产品但没有成本,我希望它在这些列中抛出空值或零。
以下是表结构:
member_id first_name last_name
product_id member_id product_date
product_cost_id member_id product_cost_amount
以下是我在统一表格中寻找的内容:
member_id first_name last_name product_id product_date product_cost_amount
为了达到目的,我写了以下查询:
SELECT
M.member_id,
M.first_name,
M.last_name,
P.product_id,
P.product_date,
PC.product_cost_amount
FROM
members AS M
INNER JOIN products AS P ON P.member_id = M.member_id
INNER JOIN product_costs AS PC ON PC.member_id = M.member_id
这将返回我想要的所有列,这不是问题。假设我在成员表中有一个成员的1条记录,我有5个产品用于该成员,这也有5个成本。当我运行此查询时,我得到25个结果,我不知道为什么。我预计总共有5个结果,每个成员选择产品1行,会员详细信息和成本。我得到的是每个产品1行,重复同一产品的5行成本。
问题似乎是INNER JOIN product_costs AS PC ON PC.member_id = M.member_id
,但我尝试使用不同的联接类型运行,但我仍然没有看到正确的结果,如果没有该行,我怎么连接成本,因为那没有直接的关系?我在纸上勾画了这个图表,但我还是不明白我做错了什么。我已经构建了一个较小的测试数据库来简化和再次尝试使用100%干净的数据并且仍然是相同的结果(这来自的实际数据库是巨大的,查询量大,所以我在这里简化了它隔离结果并使其更容易使用)。
任何人都可以帮助我理解为什么这个加入不起作用?可能是成本与产品本身之间没有直接关系吗?如果是这样,我并不反对直接连接这两者,因为从技术上来说,总是应该付出代价,即使这个成本在技术上是免费的。我只是继承了这个数据库设计,并且假设他们仍然通过member_id
与成员联系在一起,我不明白为什么会这样。
提前感谢您提供任何帮助!
答案 0 :(得分:2)
join
表格product_costs
上的products
条件丢失了:
FROM members M INNER JOIN
products P
ON P.member_id = M.member_id INNER JOIN
product_costs PC
ON PC.member_id = M.member_id AND
PC.product_id = P.product_id