我是SQL的新手,正在尝试在SQL查询中添加条件。
我每年有4个产品定价文件,另外还有一个产品表。
>> mongodump --db=test --collection=test --query="{ \"_id\": { \"$eq\" : { \"$oid\": \"5fab80615397db06f00503c3\" } } }"
2020-11-11T11:42:13.705+0530 writing test.test to dump\test\test.bson
2020-11-11T11:42:13.737+0530 done dumping test.test (1 document)
所有表的数据如下
price_table_2020
price_table_2019
price_table_2019
:
price_table_2020
product price product_description
-------------------------------------
ball 100 plastic ball
ink 80 ink for pen
pen 1000 pen
bucket 200 bucket
:
price_table_2019
product price product_description
------------------------------------
ball 90 plastic ball
ink 70 ink for pen
pen 900 pen
bucket 100 bucket
:
price_table_2018
产品表如下:
product price product_description
-------------------------------------
ball 80 plastic ball
ink 60 ink for pen
pen 800 pen
bucket 300 bucket
根据发票的年份,我应该从相应的表格中获取相应产品的价格。
预期输出如下:
product invoice_year
---------------------
pen 2019
ball 2020
ink 2020
我可以从下面的一张表中获取价格
product invoice_year price
----------------------------
pen 2019 900
ball 2020 100
ink 2020 80
如果我必须包含基于select A.price, B.product, B.product_description
from product A
inner join price_table_2020 B on A.product = B.product
的逻辑,有人可以帮忙吗?谢谢。
答案 0 :(得分:3)
至少可以说,您尝试做的事情很困难。我强烈建议您重组表以将所有价格数据放在一个表中,并在该表中添加一个year
列以指示价格适用于哪一年。然后您的查询变得简单:
SELECT pr.product,
pr.invoice_year,
pc.price
FROM product pr
JOIN price_table pc ON pc.product = pr.product
AND pc.year = pr.invoice_year
ORDER BY pr.invoice_year, pr.product
输出(用于您的示例数据):
product invoice_year price
pen 2019 900
ball 2020 100
ink 2020 80
如果必须保持当前的表结构,则可以使用所有price
表中的UNION
来模拟上面的price
表:>
SELECT pr.product,
pr.invoice_year,
pc.price
FROM product pr
JOIN (
SELECT *, 2020 AS year
FROM price_table_2020
UNION ALL
SELECT *, 2019
FROM price_table_2019
UNION ALL
SELECT *, 2018
FROM price_table_2018
) pc ON pc.product = pr.product
AND pc.year = pr.invoice_year
ORDER BY pr.invoice_year, pr.product
此查询的输出是相同的。这种方法的缺点是,每次添加新的price
表时,您都必须编辑查询。
答案 1 :(得分:3)
这是一个非常糟糕的数据模型。数据属于表,而不属于数据库结构。年仅仅是数据(可以从产品表中看到),它应该是价格表中的数据。相反,您每年有一个单独的价格表。如下所示,这使编写查询变得很麻烦。我建议您更改此数据模型。
select p.*, coalesce(p2018.price, p2019.price, p2020.price) as invoice_price
from products p
left join price_table_2018 p2018 on p2018.product = p.product and p.invoice_year = 2018
left join price_table_2019 p2019 on p2019.product = p.product and p.invoice_year = 2019
left join price_table_2020 p2020 on p2020.product = p.product and p.invoice_year = 2020
order by p.product;