LEFT JOIN - w zakresie ?

0

Cześć,

opis w temacie może nie najlepszy ale nie wymyśliłem nic mądrzejszego. Problem polega na połączeniu 2 tablic gdzie z nie wiadomego powodu jest rozjazd na czasie [TransactionTime] i w jednej z tablic ta kolumna posiada wartość albo o sekundę mniejszą bądź większą. Pytanie brzmi czy jest jakiś mądrzejszy/sprytniejszy/przejrzystszy sposób na poniższy kod ?
Tym bardziej, że na tą chwile wiemy, że to tylko sekunda ale kto wie co się może zdarzyć w przyszłości.

...
	LEFT JOIN Baan..InventoryTransactionsByItem it
		ON pd.TransactionDate = it.TransactionDate
		AND pd.TransactionTime = it.TransactionTime
		AND pd.OrderNumber = it.OrderNumber
		AND pd.OrderLine = it.OrderLineNumber
		AND pd.Warehouse = it.Warehouse
	-- Due to issue with time difference for some records and 1 second difference we MINUS 1 sec in Inv. Trans. table	
	LEFT JOIN Baan..InventoryTransactionsByItem it1
		ON pd.TransactionDate = it1.TransactionDate
		AND pd.TransactionTime = it1.TransactionTime - 1 -- << pomniejszam czas o sec 
		AND pd.OrderNumber = it1.OrderNumber
		AND pd.OrderLine = it1.OrderLineNumber
		AND pd.Warehouse = it1.Warehouse
	-- Due to issue with time difference for some records and 1 second difference we ADD 1 sec in Inv. Trans. table	
	LEFT JOIN Baan..InventoryTransactionsByItem it2
		ON pd.TransactionDate = it2.TransactionDate
		AND pd.TransactionTime = it2.TransactionTime + 1 -- << podwyższam czas o sec
		AND pd.OrderNumber = it2.OrderNumber
		AND pd.OrderLine = it2.OrderLineNumber
		AND pd.Warehouse = it2.Warehouse

Po tak podłączonych tabelach potrzebną wartość wybieram korzystając z COALESCE()

COALESCE(it.Quantity, it1.Quantity, it2.Quantity)

Z góry dzięki za podpowiedzi.

4
AND pd.TransactionTime between it.TransactionTime -1 and it.TransactionTime + 1

??
wtedy nie potrzebujesz 3 joinów tylko 1

0

Możesz wybrać wiersze normalnie jak w poście wyżej a potem użyć PIVOT (https://docs.microsoft.com/en-us/sql/t-sql/queries/from-using-pivot-and-unpivot?view=sql-server-ver15) żeby zamienić wiersze na kolumny

// edit - a nie doczytałem że potem robisz COALESCE na kolumnach. W takim razie nie potrzebujesz pivot ale możesz użyć podzapytania z limit żeby mieć pewność że wybierzesz tylko jedną transakcję.
Ten sposób się w ogóle nie wydaje zbyt dobry bo co jeśli faktycznie będą dwie transakcje oddzielone od siebie o sekundę? Może się zdarzyć jeśli klient użyje do tego jakiegoś API. Wtedy nie masz szans dopasować do siebie tych rekordów. Może lepiej dotrzeć do źródła problemu albo joinować po jakimś ID zamiast czasie

2

jprdl (sorry) - ja naprawdę muszę wziąć urlop Dzisus :|

@woolfik: oczywiście, że tak - spaliłem się i właśnie sklejam się na nowo

1 użytkowników online, w tym zalogowanych: 0, gości: 1