想要防止MySQL内部连接两个表,在结果JavaSwing中产生不需要的行吗
亲爱的朋友们,我正在开发JavaSwing项目,我有两个Mysql表,如下所示 表格购买想要防止MySQL内部连接两个表,在结果JavaSwing中产生不需要的行吗,mysql,inner-join,Mysql,Inner Join,亲爱的朋友们,我正在开发JavaSwing项目,我有两个Mysql表,如下所示 表格购买 +------------+-----------+------------+-----------+-----+ | Date | Commodity | PurchPrice | SalePrice | Qty | +------------+-----------+------------+-----------+-----+ | 2020-06-10 | A |
+------------+-----------+------------+-----------+-----+
| Date | Commodity | PurchPrice | SalePrice | Qty |
+------------+-----------+------------+-----------+-----+
| 2020-06-10 | A | 123 | 150.0 | 15 |
| 2020-06-12 | A | 125 | 150.0 | 25 |
| 2020-06-14 | A | 120 | 150.0 | 30 |
| 2020-06-16 | A | 124 | 150.0 | 35 |
| 2020-06-18 | A | 126 | 160.0 | 40 |
+------------+-----------+------------+-----------+-----+
表有效库存
+-----------+-----------+-----+
| Commodity | SalePrice | Qty |
+-----------+-----------+-----+
| A | 150.0 | 25 |
| A | 160.0 | 30 |
+-----------+-----------+-----+
这是我的Sql查询
String query = "SELECT Distinct Date,Purchase.Commodity,AvailStock.Commodity, "
PurchPrice,Purchase.SalePrice,AvailStock.SalePrice,AvailStock.Qty "
+ "From AvailStock "
+ "Inner Join Purchase "
+ "On Purchase.SelePrice = AvailStock.SalePrice "
+ "And Purchase.Commodity = AvailStock.Commodity "
+ "Where Commodity =? "
+ "And AvailStock.Qty!=0 ";
它给出了以下结果
+------------+-----------+------------+-----------+-----+
| Date | Commodity | PurchPrice | SalePrice | Qty |
+------------+-----------+------------+-----------+-----+
| 2020-06-10 | A | 123 | 150 | 25 |
| 2020-06-12 | A | 125 | 150 | 25 |
| 2020-06-14 | A | 120 | 150 | 25 |
| 2020-06-16 | A | 124 | 150 | 25 |
| 2020-06-18 | A | 126 | 160 | 30 |
+------------+-----------+------------+-----------+-----+
它给出了一个夸大的数量输出
我想要下面的结果
+------------+-----------+------------+-----------+-----+
| Date | Commodity | PurchPrice | SalePrice | Qty |
+------------+-----------+------------+-----------+-----+
| 2020-06-16 | A | 124 | 150 | 25 |
| 2020-06-18 | A | 126 | 160 | 30 |
+------------+-----------+------------+-----------+-----+
尝试了左连接和右连接,但没有内部连接,结果都是一样的
这里的问题是商品A有两个销售价格。即150和160。在这160个国家中,只有一个国家的价格。因此,对于销售价格为160的商品A,结果是正确的
但对于销售价格为150的商品A,有4个不同的购买价格,因此结果中,对应于每个购买价格的4行出现,从而导致总可用数量的错误
有人请帮我得到想要的结果
注意:-实际上,此错误仅发生在购买价格不同但销售价格相同的商品上,如上表所示。如果您只想填写最后一个订单,则需要过滤掉所有“旧”行。可以通过在
WHERE
子句中添加以下额外条件来完成此操作:
SELECT Date,AvailStock.Commodity,
AvailStock.SalePrice,PurchPrice,AvailStock.Qty
From Purchase
Inner Join AvailStock
On Purchase.SalePrice = AvailStock.SalePrice
And Purchase.Commodity = AvailStock.Commodity
Where AvailStock.Commodity ='A'
And AvailStock.Qty!=0
and (AvailStock.Commodity, AvailStock.SalePrice, Purchase.Date) in (
select p.Commodity, p.SalePrice, max(date)
from Purchase p
join AvailStock a on a.Commodity = p.Commodity
and a.SalePrice = p.SalePrice
group by p.Commodity, p.SalePrice
)
根据性能进行编辑
以下索引理论上可以提高此查询的性能:
create index ix1 on AvailStock (Commodity, Qty);
create index ix2 on Purchase(Commodity, SalePrice, Date);
create index ix3 on AvailStock (Commodity, SalePrice);
我不懂逻辑。你能解释一下你想要得到什么结果吗?商品=?后面不应该有空格吗?或者这无关紧要吗?亲爱的穿刺者,我已经给出了最后一个表所需的结果。亲爱的草莓,我已经编辑了查询并添加了空格。似乎你只想填写最后一个订单。这就是你想要的吗?亲爱的穿刺者Max(date)在一般情况下不会解决问题,因为这里的问题是商品A有两个销售价格。即150和160。在这160个国家中,只有一个国家的价格。因此,对于销售价格为160的商品A,结果是正确的。但如果商品A的销售价格为150,则有4个不同的购买价格,因此结果中的4行对应于每个购买价格,导致结果中的总可用数量出现错误,这与您给定的附加条件有关。但是得到一个SQL异常“未选择数据库”。还尝试将最后一个p.purchprice更改为p.saleprice。您的列名和查询不一致。请将您的示例添加到“好的,我会这样做”中。这是指向db fiddle的链接