SQL 查询结果重复

SQL query results are duplicating

使用下面的查询

SELECT * FROM Customer, Orders, Orderline, Product

结果为 6500 行而不是 30 行。我正在使用 SQL Server Management Studio

Customer

----------------------------------------   
CustomerNo CustomerName CustomerAddress
----------------------------------------

1          Harry        19 mousemat

2          Potter       98a speakers

Orders
-------------------------------
OrderID CustomerNo OrderDate
-------------------------------

 1       1         12/3/1992

 2       2         13/5/1997



OrderLine
-----------------------------
OrderID ProductID ProductQty 
-----------------------------
1       100       27 

2       101       30


Products
-----------------------------------
ProductID ProductDesc ProductPrice
-----------------------------------

100       Blue        0.13 

101       Yellow      1.21

您应该使用 JOINS 来 link 右键上的表。

例如

SELECT * 
FROM Orderline OL
JOIN Orders O
    ON OL.OrderId = O.OrderId
JOIN Product P
    ON OL.ProductId = P.ProductId
JOIN Customer C
    ON O.CustomerNo = C.CustomerNo;

您需要在表之间有一个 JOIN 语句。如果仍有重复项,请在 select 关键字后使用 distinct 关键字:

select distinct * 
from a
    join b on b.id = a.id
    join c on c.id = b.id

在您的案例中,它应该是这样的:

select *
from Customer C
    join Orders O on (O.CustomerNo = C.CustomerNo)
    join OrderLine OL on (OL.OrderID = O.OrderID)
    join Products P on (P.ProductID = OL.ProductID);

连接语句默认为 inner/natural 连接。您想 link 根据它们作为 primary/secondary 键的共同点对表进行排序。

当您在 sql 中的多个表之间没有联接时,sql 将在它们之间进行组合。这就是为什么您最终得到 6500 行而不是 30 行的原因。

如果查询只是 SELECT * FROM Customer, Orders, Orderline, Product 那么您在查询中进行了 "implicit" CROSS JOIN 或笛卡尔连接。在查询中使用多个表时,您应该指定 JOIN - 您希望如何连接它们。

SELECT * 
FROM Customer as c
INNER JOIN Orders as o
ON c.CustomerNo = o.CustomerNo
INNER JOIN Orderline as ol
ON o.OrderID = ol.OrderID 
INNER JOIN Product as p
ON ol.ProductID = p.ProductID