SQL результаты запроса дублируются - PullRequest
0 голосов
/ 28 мая 2020

Использование запроса ниже

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

Ответы [ 3 ]

1 голос
/ 28 мая 2020

У вас должен быть оператор JOIN между таблицами. Если все еще есть дубликаты, используйте ключевое слово own после ключевого слова select:

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);

Оператор соединения - это внутреннее / естественное соединение по умолчанию. Вы хотите связать таблицы с помощью того, что у них общего как первичный / вторичный ключ.

Если у вас нет объединений между несколькими таблицами в sql, sql будет создавать комбинации между ними. Вот почему вы получаете 6500 строк вместо 30.

1 голос
/ 28 мая 2020

В случае, если запрос равен SELECT * FROM Customer, Orders, Orderline, Product, тогда вы сделали «неявное» 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
1 голос
/ 28 мая 2020

Вы должны использовать JOINS для связывания таблиц на правильных ключах.

например,

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;
...