2017-08-11 15 views
1

我正在使用支持MySQL和SQLite的前端。使用SQLite在JOIN中進行MySQL查詢

但是,我正在運行的其中一個查詢已加入UPDATE部分。在谷歌搜索之後,這在SQLite中不受支持。

查詢是這樣的:

UPDATE playertimes t 
LEFT JOIN 
    (SELECT MIN(time) mintime, 
      MAP, 
      track, 
      style 
    FROM playertimes 
    GROUP BY MAP, 
      track, 
      style) minjoin ON t.time = minjoin.mintime 
AND t.MAP = minjoin.MAP 
AND t.track = minjoin.track 
AND t.style = minjoin.style 
JOIN 
    (SELECT ((50.0 * 2) * 1.5) points) best 
JOIN 
    (SELECT (COUNT(*) * (2/10.0)) points, 
            MAP, 
            track, 
            style 
    FROM playertimes 
    GROUP BY MAP, 
      track, 
      style) additive ON t.MAP = additive.MAP 
AND t.track = additive.track 
AND t.style = additive.style 
JOIN 
    (SELECT MIN(time) lowest, (MIN(time)/15.0) points, 
               MAP, 
               track, 
               style 
    FROM playertimes 
    GROUP BY MAP, 
      track, 
      style) FINAL ON t.MAP = FINAL.MAP 
AND t.track = FINAL.track 
AND t.style = FINAL.style 
JOIN 
    (SELECT (1.0) style, (1.0) track) multipliers 
SET t.points = (CASE 
        WHEN minjoin.mintime IS NOT NULL THEN (((best.points + additive.points + FINAL.points) * multipliers.style) * multipliers.track) 
        ELSE (((((best.points + additive.points + FINAL.points) * multipliers.style) * multipliers.track) * (FINAL.lowest/t.time)) * 0.85) 
       END) 
WHERE t.MAP = 'bhop_atom' 
    AND t.track = 0 
    AND t.style = 0; 

錯誤:

near "t": syntax error 

(我知道它像multipliers選擇一些地方看起來他們並沒有什麼意義,在SQL級別的事,但我計劃改變這些動態很快,其中一些部分實際上被替換爲我前端的變量)

我的目標是讓這個查詢的最終結果在只有一個初始查詢(子查詢很好)。我怎樣才能實現它?如果最終查詢與MySQL不兼容,那麼這很好,因爲我正在讓應用程序爲MySQL或SQLite發送不同的查詢,以防它們不兼容。

注意:結果與我希望這些查詢在MySQL上運行時一樣。

回答

-1

SQLite不支持更新語句中的別名。請嘗試使用沒有別名的腳本。你在哪裏都必須別名「T」,試着用「playertimes」替換它如下:

AND playertimes.track = additive.track 
AND playertimes.style = additive.style 
+0

不幸的是,情況並非如此。 '接近「左」:語法錯誤' – shavit

1

使用作爲單獨的連接固定值很麻煩;我已經讓他們parameters

UPDATE語句本身必須只使用一個表(不帶別名);您必須用correlated subquery查找新值。

讓我們將所有這些子查詢轉移到common table expressions

該外連接僅用於檢查行是否存在;我寧願使用EXISTS。 (但是使用外部連接可能會節省一些打字量。)

WITH minjoin AS (
    SELECT MIN(time) AS mintime, 
     MAP, 
     track, 
     style 
    FROM playertimes 
    GROUP BY MAP, 
      track, 
      style 
), 
additive AS (
    SELECT COUNT(*) * (2/10.0) AS points, 
     MAP, 
     track, 
     style 
    FROM playertimes 
    GROUP BY MAP, 
      track, 
      style 
), 
FINAL AS (
    SELECT MIN(time) AS lowest, 
     MIN(time)/15.0 AS points, 
     MAP, 
     track, 
     style 
    FROM playertimes 
    GROUP BY MAP, 
      track, 
      style 
) 
UPDATE playertimes 
SET points = (SELECT (:BestPoints + additive.points + FINAL.points) * 
        :MultipliersStyle * :MultipliersTrack * 
        CASE WHEN EXISTS (SELECT * 
             FROM minjoin 
             WHERE mintime = playertimes.time 
             AND MAP  = playertimes.MAP 
             AND track = playertimes.track 
             AND style = playertimes.style) 
          THEN 1 
          ELSE FINAL.lowest/t.time * 0.85 
        END 
       FROM playertimes AS t 
       JOIN additive USING (MAP, track, style) 
       JOIN FINAL USING (MAP, track, style) 
       WHERE MAP = playertimes.MAP 
       AND track = playertimes.track 
       AND style = playertimes.style 
      ) 
WHERE MAP = 'bhop_atom' 
    AND track = 0 
    AND style = 0;