【发布时间】:2020-06-11 19:01:39
【问题描述】:
首先:我知道要使用所有类型的连接,但我不知道为什么这个查询会这样工作
我有一个用于制作 SQL 查询的场景,方法是使用 3 个表和销售商品和订单商品之间的左外连接。
我的表格:
--------------------
Item
--------------------
ID | Code
--------------------
1 | 7502
SQL > select * from Item where id = 1
---------------------
Item_Order
---------------------------
Item | Box | Quantity
---------------------------
1 | 30 | 15000
1 | 12 | 6000
SQL > select * from Item_Order where Item = 1
--------------------------
Invoice_Item
-------------------
Item | Num | Quantity
-------------------------
1 | 1.64 | 10
1 | 2.4 | 8
SQL > select * from Invoice_Item where Item = 1
我想要这个输出:
Item | OrderQ | OrderB | SellN | SellQ
-----------------------------------------
1 | 1500 | 30 | 1.64 | 10
1 | 6000 | 12 | 2.4 | 8
我的 SQL 代码:
SELECT Item.ID, Item_Order.Box As OrderB, Item_Order.Quantity As OrderQ, Invoice_Item.Num As SellN, Invoice_Item.Quantity As SellQ
FROM Item LEFT OUTER JOIN
Invoice_Item ON Item.ID = Invoice_Item.Item LEFT OUTER JOIN
Item_Order ON Item_Order.Item = Item.ID
where Item.ID = 1
为什么我的输出是 2x?或者为什么我的输出返回 4 条记录?
【问题讨论】:
-
您的产量翻了一番,因为您没有提供足够的订单和发票之间的关系。 SQL 应该如何知道哪个发票对应哪个订单?
-
要正确编写查询,需要了解您的架构。为此,我们需要了解您拥有的表之间的关系是什么——这些关系是通过约束强制执行的。显示 DDL。接下来,我们需要了解您的目标。如果我们不知道您要完成什么,“不起作用”的查询就不是很有用。
-
@SM我可以通过更改 sql 查询返回 2 条记录吗?
-
这并不是一个真正的外连接问题。第一次连接产生两行。对于这些行中的每一行,第二个连接会再创建两个。
-
@SMor 约束,包括 FK——“表之间的关系 [原文如此]”——不需要查询。表的含义是充分和必要的。 (基础或结果)查询表示关系(船)/关联。当约束成立时,一些表达式变得等价于独立于约束的正确查询。我们确实需要知道约束来解决依赖于它们的查询表达式。
标签: sql sql-server left-join outer-join