Mam tabelę do aktualizacji przy użyciu rekordów innej tabeli i robię to, aby przenieść informacje z jednego systemu (bazy danych) do innego. Scenariusz jest kompleks nieco, ale rozpaczliwie potrzebują pomocy :-s
SQL INNER QUERY zwraca więcej niż jedną wartość w zapytaniu UPDATE
Są 3 stoły - component
, scan
i stage_link
elementów
component_id stage_id
------------ --------
1 NULL
2 NULL
3 NULL
4 NULL
5 NULL
skanowania
scan_id component_id scanner_id date_scanned
------- ------------ ---------- -----------------------
1 1 scanner_a 2012-01-01 07:25:15.125
2 1 scanner_b 2012-01-02 08:14:05.456
3 2 scanner_a 2012-01-01 12:05:45.465
4 3 scanner_a 2012-01-01 19:45:12.536
5 1 scanner_c 2012-01-03 23:33:54.243
6 2 scanner_b 2012-01-02 11:59:12.545
stage_link
stage_link_id scanner_id stage_id
------- ---------- ----------
1 scanner_a 1
2 scanner_b 1
3 scanner_c 2
4 scanner_d 2
5 scanner_e 2
6 scanner_f 3
muszę update
ze stołu component
i set
dziedzinie stage_id
według ostatniego skanowania. Każdy skan przenosi komponent na scenę zgodnie ze skanerem. Napisałem następującą kwerendę, aby update
tabeli component
, ale rzuca błąd mówiąc;
Subquery returned more than 1 value. This is not permitted when the subquery follows '='
Zapytanie jest;
UPDATE component
SET stage_id = (select stage_id
from(
select scn.scanner_id, sl.stage_id
from scan scn
INNER JOIN stage_link sl ON scn.scanner_id = sl.scanner_id
where scn.date_scanned = ( select temp_a.max_date
from ( SELECT x.component_id, MAX(x.date_scanned) as max_date
FROM scan x
where component_id = x.component_id
GROUP BY x.component_id
) as temp_a
where component_id = temp_a.component_id)
) as temp_b
)
pracuję nad MS SQL Server
i chce to rozwiązać za pomocą żadnej PHP
lub jakiegokolwiek innego języka.
Próbowałem poświęcić jeden dzień na wykonanie tej pracy, ale nadal nie udało mi się tego dokonać. Każda pomoc będzie wysoko ceniona!
Dziękuję bardzo z góry :-)
Dziękuję bardzo za tę sugestię !! to przyniosło wielką pomoc !! Właśnie tego chciałem !!! :-) jeszcze raz, wielkie dzięki!!!!! – mithilatw
@mithilatw: Nie ma za co. Należy pamiętać, że mogą wystąpić 2 problemy z tym zapytaniem (w celu późniejszego wykorzystania): (1) Zakłada się, że data_scanned jest zawsze unikalna. Jeśli skanowane są 2 skanery w tym samym czasie (do połowy nanosekundy), wówczas SELECT id_komponentu, scanner_id' zwróci 2 wartości. (2) Pola w łączeniu 'Temp2.scanner_id = SL.scanner_id' są kolumnami opartymi na znakach, więc jeśli masz wiele skanerów, zapytanie to może zacząć zwalniać. – Kash