Mam dane stołowe jak poniżej

table1:
Order    orderitem    value    
 O1       B-IV122       10
 O2       B-IV144       10     

table2:
order    Productionorder    productionitem    ProductionValue
 O1         P1               B-IV122               5
 O2         P2               B-IV111               6
 O2         P2               CCC144                6
 O2         P2               CCC000                4

Wymagane wyjście:

  Order     Productionorder  orderitem   productionitem  value   ProductionValue
    O1         P1             B-IV122     B-IV122         10       5
    O2         P2             B-IV144     B-IV111         10       6

Próbowałem z poniższym kodem

select order,orderitem,Productionorder,productionitem,value ,ProductionValue  from 
(select order,orderitem,value from table1) t1
left outer join
(select Order,Productionorder,productionitem,ProductionValue from table2)t2
on t1.order = t2.order and t1.orderitem = t2.productionitem

Moje zapytanie:

 Order     Productionorder  orderitem   productionitem  value   ProductionValue
    O1         P1             B-IV122     B-IV122         10       5
    O2         P2             B-IV144     NULL            10       NULL

Zamiast NULL, chcę podjąć pozycję produkcyjną (B-IV111), która zaczyna się od "B" i odpowiedniej wartości .. (Uwaga: Muszę zrobić połączenie z zamówieniem i przedmiotem). Akas nie działa zgodnie z oczekiwaniami. Proszę mi zasugerować.

Z góry dziękuję.

-1
rajini 23 lipiec 2020, 16:20

2 odpowiedzi

Najlepsza odpowiedź
SELECT t1.[order]
    ,orderitem
    ,value
    ,productionitem
    ,productionvalue
FROM table1 t1
INNER JOIN table2 t2 ON t1.[order] = t2.[order]
    AND LEFT(t1.orderitem, 3) = LEFT(t2.productionitem, 3)
1
apomene 23 lipiec 2020, 13:44

Brzmi jak chcesz inner join:

select t1.order, t1.orderitem, t1.Productionorder, t2.productionitem, t1.value, t2.ProductionValue
from table1 t1 join
     table2 t2
     on t1.order = t2.order and t1.orderitem = t2.productionitem;

Składnicy nie zapewniają żadnej wartości do zapytania, więc je usunąłem.

EDYTOWAĆ:

Możesz użyć outer apply dla swojego przykładu:

select t1.order, t1.orderitem, t1.Productionorder,
       t2.productionitem, t1.value, t2.ProductionValue
from table1 t1 outer apply
     (select top (1) t2.*
      from table2 t2
      where t1.order = t2.order 
      order by (case when t1.orderitem = t2.productionitem then 1 else 2 end)
     ) t2;

Uwaga: Działa to dla konkretnego przykładu w pytaniu. Jeśli twój rzeczywisty problem jest bardziej skomplikowany, ponieważ pasuje wiele wierszy, które pasują, a to nie pasuje, zażądałbym, aby zapytał pytanie z odpowiednich przykładowych danych, wyjaśnienia i skrzypce DB / SQL byłoby bardzo pomocne.

0
Gordon Linoff 23 lipiec 2020, 14:12