如何连接两个表以在视图中获取输出

Posted

技术标签:

【中文标题】如何连接两个表以在视图中获取输出【英文标题】:How can I join two tables to get an output in a view 【发布时间】:2021-10-25 18:12:21 【问题描述】:

我正在尝试通过执行 amount*price_for_each 来计算交易的总价值。

例如,5 个大蒜、8 个面包、1 个鸡肉和 1 个米饭。大蒜(从物品)的价格是25,面包是200,鸡肉是450,米饭是200。5⋅25+8⋅200+1⋅450+1⋅200=2125

CREATE TABLE Items(
price_for_each INT,
name VARCHAR(20),
PRIMARY KEY(name)
);

CREATE TABLE ItemsInTransactions(
name VARCHAR(20),
t_id INT,
amount INT,
FOREIGN KEY(name) references Items(name),
FOREIGN KEY(t_id) references Transactions(t_id)
);

CREATE VIEW TransactionValue AS
SELECT DISTINCT t_id,sum(amount*price_for_each) as value
FROM Items price_for_each, ItemsInTransactions amount 
GROUP BY t_id
ORDER BY t_id;

我认为问题出在我看来,输出的值远高于预期,这使我相信存在算术错误(可能相乘太多)。如果有人可以解释一种更好的方法来计算我的输出,我们将不胜感激

enter image description here

【问题讨论】:

此处无需执行 SELECT DISTINCT,您的 GROUP BY 不会返回重复项。 (事实上​​,这种组合引起了很多人的注意......) 不要破坏你的问题。 请勿以使发布的合理答案无效的方式编辑问题帖子。 help centerMeta Stack Exchange请use text, not images/links, for text--including tables & ERDs。转述或引用其他文本。只提供您需要的东西并将其与您的问题联系起来。仅将图像用于无法表达为文本或增强文本的内容。在图片中包含图例/键和说明。 【参考方案1】:

FROM Items price_for_each, ItemsInTransactions amount 是旧的不推荐使用的交叉连接方式(生成 Items 和 ItemsInTransactions 记录的每个组合)。你想要一个内部连接:

FROM ItemsInTransactions amount
INNER JOIN Items price_for_each on price_for_each.name=amount.name

因此,您只需查找相关商品的每件价格。

其他一些 cmets:DISTINCT 在这里是多余的,您的 group by 已经确保每个 t_id 只有一行。表别名应该有助于记录您的查询正在做什么,或者只是允许您更简洁地引用表字段;在这里,您使用的别名描述了您从表中获得的内容,这并不是特别有用。

【讨论】:

【参考方案2】:

你正在使用交叉连接,它将结合所有可用的乌鸦

最好总是使用连接

CREATE VIEW TransactionValue AS
SELECT t_id,sum(amount*price_for_each) as value
FROM Items i JOIN  ItemsInTransactions iit ON i.name  = iit.name 
GROUP BY t_id
ORDER BY t_id;

【讨论】:

感谢您的回答,我似乎用这种方法得到了正确的输出。在旁注中,我刚刚编辑了我的问题,但我仍然收到了一个错误。你能发现我在任何地方都有的语法错误吗? 为此,我必须查看原件,但它应该可以工作 dbfiddle.uk/… 如果您的意思是您的查询,那么您写的内容毫无意义,这就是为什么使用我的重写

以上是关于如何连接两个表以在视图中获取输出的主要内容,如果未能解决你的问题,请参考以下文章

连接两个表以获取确切日期

如何连接两个表以获得以下结果?

如何连接表以选择连接表中的最大行? [复制]

使用两个不同的外键连接两个表以获得相同的字段

如何查询多个表以获取表具有相同列名的记录

使用 switch case 连接两个表以避免一对多连接