Mam więc kilka tabel:

___ TABLE A (users info) ___
team_id | user_id | points | rewards

___ TABLE B (points for every event)___
team_id | user_id | points | rewards | event_type

___ Table C (users) ___
user_id | name | etc..

W tabeli A mam informacje podsumowujące dla wszystkich użytkowników opartych na zespole. W tabeli b mam informacje atomowe dla każdego wydarzenia (coś w rodzaju historii). Chciałbym zaktualizować informacje w tabeli A (Punkty i Rewards) przez niektóre z tych samych pól z Tabeli B za pomocą tylko user_id. Moim problemem jest to, że nie mogę zrozumieć, jak mogę to zrobić w jednym zapytaniu.

Na przykład mogę zrobić zapytanie

WITH storage as (
    SELECT
        sum(points) as points,
        sum(rewards) as rewards,
        team_id FROM B
    WHERE user_id = 1 AND team_id = 1
)

UPDATE A
SET
   points = (
      SELECT points FROM storage
),
   rewards = (
      SELECT rewards FROM storage)
WHERE user_id = 1 and team_id = 1 ;

Ale chciałbym uruchomić tę akcję bez team_id. Na przykład biegam SQL jak

WITH storage as (
    SELECT
        sum(points) as points,
        sum(rewards) as rewards,
        team_id FROM B
    WHERE user_id = 1 GROUP BY team_id
)

A po tym punktach aktualizacji i nagrody za każdą linię w tabeli B na podstawie Team_ID. Czy można wykonać zapytanie bez pętli na końcu? Aktualizacja : Jest dla bazy danych SQLite Aktualizacja 2 Możesz znaleźć odpowiedź Wpisz opis Link tutaj

0
Oleksandr Dashkov 17 luty 2017, 02:19

2 odpowiedzi

Najlepsza odpowiedź

W końcu znalazłem rozwiązanie dla SQLite. To naprawdę blisko mojego pierwszego zapytania.

WITH storage as (
    SELECT
        sum(points) as points,
        sum(rewards) as rewards,
        team_id FROM B
    WHERE team_id IS NOT NULL
    GROUP BY user_id, team_id
)

UPDATE A
SET
   points = (
      SELECT points FROM storage WHERE 
      storage.team_id = A.team_id AND storage.user_id = A.user_id
),
   rewards = (
      SELECT rewards FROM storage WHERE
      storage.team_id = A.team_id AND storage.user_id = A.user_id
)
WHERE user_id = 1;

Możliwe jest również usunięcie nieużywanych danych do dodania, gdzie oświadczenie z blokiem pamięci (dodaj filtr przez użytkownika_id)

WITH storage as (
    SELECT
        sum(points) as points,
        sum(rewards) as rewards,
        team_id FROM B
    WHERE team_id IS NOT NULL AND user_id = 1
    GROUP BY team_id
)

UPDATE A
SET
   points = (
      SELECT points FROM storage WHERE storage.team_id = A.team_id
),
   rewards = (
      SELECT rewards FROM storage WHERE storage.team_id = A.team_id
)
WHERE user_id = 1;
0
Oleksandr Dashkov 17 luty 2017, 00:52

Lubię to?

update A set A.points = B.sumpoints, A.reward = B.sumreward 
from A, 
  (select userid, teamid, sum(points) sumpoints, sum(reward) sumreward 
   from B group by userid, teamid) B 
where A.userid = B.userid and A.teamid = B.teamid
0
Bernhard 17 luty 2017, 00:11