Próbuję wykonać sprzężenie w ramach 4 tabel, ale zwraca zduplikowane wiersze. Niektóre pozycje mogą nie istnieć w tabelach Sales i Inventory. Co należy zrobić, aby rozwiązać problem;

ProductList (potrzebujemy wszystkich elementów)

Item_ID

ProductDetail (zawiera zwrot wszystkich pasujących pozycji z listy produktów)

Item_ID
Product_Name

Sprzedaż (musi zwrócić wszystkie pasujące elementy z listy produktów)

Item_ID
Sales_Qty

Inwentarz

Item_ID
Remaining_Qty

PRZYKŁADOWE DANE

Lista produktów

Item_Id
--------
0001
0002
0003
0004

Szczegóły produktu

Item_Id   Product_Name
-----------------------
0001      Eraser
0002      Pencil
0003      Pen
0004      Mouse
0005      Keyboard
0006      Monitor
0007      Cable

Sprzedaż

Item_ID   Sales_Qty
--------------------
0001      15
0002      20
0004      50
0005      60
0006      45

Inwentarz

Item_ID   Remaining
-------------------
0001      100
0002      95
0003      55
0005      101
0006      13
0007      18

Pożądane wyjście:

Item_Id    Item_Name   Sales_Qty    Remaining_Qty
--------------------------------------------------
0001      Eraser          15           100
0002      Pencil          20            95
0003      Pen             0             55
0004      Mouse           50            0

Moje zapytanie:

SELECT *
FROM ProductList a 
INNER JOIN ProductDetail b ON a.Item_ID = b.ItemID 
LEFT JOIN Sales c ON a.Item_Id = c.Item_ID 
LEFT JOIN Inventory d ON a.Item_ID = d.Item_ID
-3
AAA 20 grudzień 2019, 03:50
1
Jeśli otrzymujesz duplikaty, dzieje się tak dlatego, że Item_ID pojawia się więcej niż raz w co najmniej jednej połączonej tabeli. Musisz zastanowić się, jak chcesz rozwiązać te duplikaty? Weź pierwszy wiersz, zsumuj wartości, uśrednij wartości itp. Lub jeśli są to naprawdę zduplikowane wartości, możesz użyć SELECT DISTINCT...
 – 
fubar
20 grudzień 2019, 03:54
1
Jeśli chcesz zwrócić wszystkie dopasowania sprzedaży do listy produktów, dlaczego używasz LEFT JOIN? Czy możesz również podać przykładowe dane i oczekiwane wyniki? Z góry dziękuję
 – 
sam
20 grudzień 2019, 04:19
1
Proszę podać przykładowe dane i pożądane wyniki.
 – 
Gordon Linoff
20 grudzień 2019, 04:23
„Zduplikowane wiersze” są niejasne i nie mówisz, że wyjście jest funkcją wejścia i nie podajesz przykładu, więc jak możemy pomóc? W pytaniach o kod podaj minimalny powtarzalny przykład--wytnij, wklej i uruchom kod; przykładowe wejście (jako kod inicjujący) z pożądanym i rzeczywistym wyjściem (w tym dosłowne komunikaty o błędach); tagi i wersje; jasna specyfikacja i wyjaśnienie. W przypadku błędów, które zawierają najmniej kodu, który możesz podać, jest to kod, który pokazujesz, że jest OK, rozszerzony o kod, który pokazujesz, że nie jest OK. (Podstawowe debugowanie.) Dla SQL, który obejmuje DBMS i DDL, który obejmuje ograniczenia i indeksy oraz inicjalizację tabelaryczną.
 – 
philipxy
20 grudzień 2019, 04:31
1
Wtedy musisz użyć left join dla wszystkich stołów.
 – 
sam
20 grudzień 2019, 20:58

2 odpowiedzi

Możesz użyć DISTINCT

SELECT DISTINCT a.Item_ID, * 
FROM ProductList a 
    INNER JOIN ProductDetail b 
        ON a.Item_ID = b.ItemID 
    LEFT JOIN Sales c 
        ON a.Item_Id = c.Item_ID 
    LEFT JOIN Inventory d 
        ON a.Item_ID = d.Item_ID
0
jarlh 20 grudzień 2019, 11:40

Spróbuj tego:

SELECT a.Item_Id, b.product_Name, c.Sales_Qty, d.Remaining_Qty
    FROM      ProductList a 
    LEFT JOIN ProductDetail b      
              ON a.Item_ID = b.Item_ID 
    LEFT JOIN Sales c              
              ON a.Item_Id = c.Item_ID 
    LEFT JOIN Inventory d          
              ON a.Item_ID = d.Item_ID

Spowoduje to wytworzenie tego wyjścia:

Item_Id     product_Name    Sales_Qty   Remaining_Qty
---------------------------------------------------
  0001          Eraser        15          100
  0002          Pencil        20           95
  0003          Pen          NULL          55
  0004          Mouse         50         NULL

Jeśli nie chcesz, aby zwracane były wartości null, użyj COALESCE (jeśli twoja baza danych jest serwerem sql, możesz użyć ISNULL zamiast COALESCE), jak pokazano poniżej:

SELECT a.Item_Id, b.product_Name, COALESCE(c.Sales_Qty, 0), COALESCE(d.Remaining_Qty, 0)
    FROM      ProductList a 
    LEFT JOIN ProductDetail b     
              ON a.Item_ID = b.Item_ID 
    LEFT JOIN Sales c             
              ON a.Item_Id = c.Item_ID 
    LEFT JOIN Inventory d         
              ON a.Item_ID = d.Item_ID

Spowoduje to wytworzenie tego wyjścia:

Item_Id    Item_Name     Sales_Qty    Remaining_Qty
--------------------------------------------------
 0001         Eraser          15           100
 0002         Pencil          20            95
 0003         Pen             0             55
 0004         Mouse           50            0
0
sam 20 grudzień 2019, 21:58