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
使用下面的查询
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