2013-07-14 23 views
0

我試圖將一些測試數據插入到MySQL數據庫中,該數據庫具有參考ID和變量值的混合。我的發言,由MySQL與它拒絕的通用(和公然旁邊毫無價值) 「語法錯誤附近xxx」 的錯誤是:將測試數據插入到SQL表中

INSERT INTO TimeSlotWorker (TimeSlotId, WorkerId, PostCode, CitySuburbName) 
SELECT      TimeSlotId, 1  , PostCode, CitySuburbName 
FROM (
       SELECT TimeSlotId FROM TimeSlot WHERE (DayCode = 'MON' AND SequenceNbr = 1), '2914' AS PostCode, '' AS CitySuburbName 
    UNION ALL SELECT TimeSlotId FROM TimeSlot WHERE (DayCode = 'MON' AND SequenceNbr = 2), '2912'   , '' 
    UNION ALL SELECT TimeSlotId FROM TimeSlot WHERE (DayCode = 'MON' AND SequenceNbr = 2), '2913'   , '' 
    UNION ALL SELECT TimeSlotId FROM TimeSlot WHERE (DayCode = 'MON' AND SequenceNbr = 2), '2911'   , '' 
    UNION ALL SELECT TimeSlotId FROM TimeSlot WHERE (DayCode = 'MON' AND SequenceNbr = 3), '2615'   , 'Charnwood' 
    UNION ALL SELECT TimeSlotId FROM TimeSlot WHERE (DayCode = 'MON' AND SequenceNbr = 3), '2615'   , 'Dunlop' 
    UNION ALL SELECT TimeSlotId FROM TimeSlot WHERE (DayCode = 'MON' AND SequenceNbr = 3), '2615'   , 'Florey' 
    UNION ALL SELECT TimeSlotId FROM TimeSlot WHERE (DayCode = 'MON' AND SequenceNbr = 3), '2615'   , 'Flynn' 
    UNION ALL SELECT TimeSlotId FROM TimeSlot WHERE (DayCode = 'MON' AND SequenceNbr = 3), '2615'   , 'Fraser' 
    UNION ALL SELECT TimeSlotId FROM TimeSlot WHERE (DayCode = 'MON' AND SequenceNbr = 3), '2615'   , 'Higgins' 
    UNION ALL SELECT TimeSlotId FROM TimeSlot WHERE (DayCode = 'MON' AND SequenceNbr = 3), '2615'   , 'Holt' 
    UNION ALL SELECT TimeSlotId FROM TimeSlot WHERE (DayCode = 'MON' AND SequenceNbr = 3), '2615'   , 'Kippax' 
    UNION ALL SELECT TimeSlotId FROM TimeSlot WHERE (DayCode = 'MON' AND SequenceNbr = 3), '2615'   , 'Latham' 
    UNION ALL SELECT TimeSlotId FROM TimeSlot WHERE (DayCode = 'MON' AND SequenceNbr = 3), '2615'   , 'Macgregor' 
    UNION ALL SELECT TimeSlotId FROM TimeSlot WHERE (DayCode = 'MON' AND SequenceNbr = 3), '2615'   , 'Melba' 
    UNION ALL SELECT TimeSlotId FROM TimeSlot WHERE (DayCode = 'MON' AND SequenceNbr = 3), '2615'   , 'Spence' 
    UNION ALL SELECT TimeSlotId FROM TimeSlot WHERE (DayCode = 'MON' AND SequenceNbr = 3), '2614'   , 'Aranda' 
    UNION ALL SELECT TimeSlotId FROM TimeSlot WHERE (DayCode = 'MON' AND SequenceNbr = 3), '2614'   , 'Cook' 
    UNION ALL SELECT TimeSlotId FROM TimeSlot WHERE (DayCode = 'MON' AND SequenceNbr = 4), '2617'   , '' 
    UNION ALL SELECT TimeSlotId FROM TimeSlot WHERE (DayCode = 'MON' AND SequenceNbr = 5), '2602'   , '' 
    UNION ALL SELECT TimeSlotId FROM TimeSlot WHERE (DayCode = 'MON' AND SequenceNbr = 5), '2612'   , '' 
    UNION ALL SELECT TimeSlotId FROM TimeSlot WHERE (DayCode = 'MON' AND SequenceNbr = 6), '2609'   , '' 
    ) 

這給:

com.mysql.jdbc.exceptions.jdbc4 .MySQLSyntaxErrorException:您的SQL語法中有錯誤;檢查對應於你的MySQL服務器版本郵編,'AS CitySuburbName UNION ALL SELECT TimeSlotId不時」使用「附近」 2914' 第4行

期待此項插入22條記錄正確的語法手冊每一個單一的TimeSlotId來自一個現有的記錄,我試圖避免硬編碼其生成的ID。

  1. 我哪裏錯了,首先?
  2. 有沒有更好的方法?
  3. 可以通過MON,TUE ... SAT來推斷插入每個子SELECT的多個記錄與DayCode不同嗎?
+1

語法ë恐怖是非常確切的;它是''2914''前面的逗號:) –

回答

1

每個UNION-ed SELECT語句都有相同的語法錯誤,無法解析。孤立地考慮的第一個

SELECT TimeSlotId FROM TimeSlot 
    WHERE (DayCode = 'MON' AND SequenceNbr = 1), 
    '2914' AS PostCode, '' AS CitySuburbName 

這些額外的列名必須是之前的FROM關鍵字:

SELECT TimeSlotId, '2914' AS PostCode, '' AS CitySuburbName 
    FROM TimeSlot 
    WHERE (DayCode = 'MON' AND SequenceNbr = 1), 

另外,整個選擇(SELECT)建設是不必要的相反,你可以插入聯合在一起一起直接SELECT語句:

INSERT INTO Table (ColList) 
    SELECT SameNumberOfColumns FROM OtherTable WHERE . . . 
    UNION ALL 
    SELECT SameNumberOfColumns FROM OtherTable WHERE . . . 

(等)

1

.1。您的子查詢只有一列TimeslotId,而在主查詢中,您選擇了三個(PostCode和CitySuburbName)。這不是一個真正的語法錯誤,但它是不正確的。語法錯誤是因爲你在在select語句之後添加那些缺失的字段,而它們應該是它的一部分。

你需要格式化子查詢是這樣的:

  SELECT TimeSlotId, '2914' AS PostCode, '' AS CitySuburbName FROM TimeSlot WHERE (DayCode = 'MON' AND SequenceNbr = 1) 
UNION ALL SELECT TimeSlotId, '2912', '' FROM TimeSlot WHERE (DayCode = 'MON' AND SequenceNbr = 2) 
UNION ALL ... 

因此,使常數值郵編和字段列表的CitySuburbName一部分。你不能在select語句後粘貼它們。

.2。我認爲這是一個很好的方法。最好的之一。 :)

.3。我不確定你的意思,但聽起來好像你可以將where子句中的DayCode排除在外,因此聯合中的每個查詢都會返回多條記錄。

+0

因此,我必須在子查詢的每個「UNION ALL」行中重複'AS PostCode'和'AS CitySuburbName'?或者我還可以忽略它們嗎? –

+0

您需要移動這些值,使它們成爲子選擇的一部分。在你的情況下,你只是將它們粘貼在where子句後面,這是錯誤的地方。你只需要在工會的第一個子查詢中使用別名,就像你已經做過的那樣。在其他人中,您只需要該值,而不是別名(可以添加它,但會被忽略)。 – GolezTrol

2

爲了讓您當前的代碼工作將其更改爲

INSERT INTO TimeSlotWorker (TimeSlotId, WorkerId, PostCode, CitySuburbName) 
SELECT      TimeSlotId, 1  , PostCode, CitySuburbName 
FROM 
(
      SELECT (SELECT TimeSlotId FROM TimeSlot WHERE DayCode = 'MON' AND SequenceNbr = 1) TimeSlotId, '2914' PostCode, '' CitySuburbName 
    UNION ALL SELECT (SELECT TimeSlotId FROM TimeSlot WHERE DayCode = 'MON' AND SequenceNbr = 2)   , '2912'   , '' 
    UNION ALL SELECT (SELECT TimeSlotId FROM TimeSlot WHERE DayCode = 'MON' AND SequenceNbr = 2)   , '2913'   , '' 
    UNION ALL SELECT (SELECT TimeSlotId FROM TimeSlot WHERE DayCode = 'MON' AND SequenceNbr = 2)   , '2911'   , '' 
    UNION ALL SELECT (SELECT TimeSlotId FROM TimeSlot WHERE DayCode = 'MON' AND SequenceNbr = 3)   , '2615'   , 'Charnwood' 
    UNION ALL SELECT (SELECT TimeSlotId FROM TimeSlot WHERE DayCode = 'MON' AND SequenceNbr = 3)   , '2615'   , 'Dunlop' 
    UNION ALL SELECT (SELECT TimeSlotId FROM TimeSlot WHERE DayCode = 'MON' AND SequenceNbr = 3)   , '2615'   , 'Florey' 
    UNION ALL SELECT (SELECT TimeSlotId FROM TimeSlot WHERE DayCode = 'MON' AND SequenceNbr = 3)   , '2615'   , 'Flynn' 
    UNION ALL SELECT (SELECT TimeSlotId FROM TimeSlot WHERE DayCode = 'MON' AND SequenceNbr = 3)   , '2615'   , 'Fraser' 
    UNION ALL SELECT (SELECT TimeSlotId FROM TimeSlot WHERE DayCode = 'MON' AND SequenceNbr = 3)   , '2615'   , 'Higgins' 
    UNION ALL SELECT (SELECT TimeSlotId FROM TimeSlot WHERE DayCode = 'MON' AND SequenceNbr = 3)   , '2615'   , 'Holt' 
    UNION ALL SELECT (SELECT TimeSlotId FROM TimeSlot WHERE DayCode = 'MON' AND SequenceNbr = 3)   , '2615'   , 'Kippax' 
    UNION ALL SELECT (SELECT TimeSlotId FROM TimeSlot WHERE DayCode = 'MON' AND SequenceNbr = 3)   , '2615'   , 'Latham' 
    UNION ALL SELECT (SELECT TimeSlotId FROM TimeSlot WHERE DayCode = 'MON' AND SequenceNbr = 3)   , '2615'   , 'Macgregor' 
    UNION ALL SELECT (SELECT TimeSlotId FROM TimeSlot WHERE DayCode = 'MON' AND SequenceNbr = 3)   , '2615'   , 'Melba' 
    UNION ALL SELECT (SELECT TimeSlotId FROM TimeSlot WHERE DayCode = 'MON' AND SequenceNbr = 3)   , '2615'   , 'Spence' 
    UNION ALL SELECT (SELECT TimeSlotId FROM TimeSlot WHERE DayCode = 'MON' AND SequenceNbr = 3)   , '2614'   , 'Aranda' 
    UNION ALL SELECT (SELECT TimeSlotId FROM TimeSlot WHERE DayCode = 'MON' AND SequenceNbr = 3)   , '2614'   , 'Cook' 
    UNION ALL SELECT (SELECT TimeSlotId FROM TimeSlot WHERE DayCode = 'MON' AND SequenceNbr = 4)   , '2617'   , '' 
    UNION ALL SELECT (SELECT TimeSlotId FROM TimeSlot WHERE DayCode = 'MON' AND SequenceNbr = 5)   , '2602'   , '' 
    UNION ALL SELECT (SELECT TimeSlotId FROM TimeSlot WHERE DayCode = 'MON' AND SequenceNbr = 5)   , '2612'   , '' 
    UNION ALL SELECT (SELECT TimeSlotId FROM TimeSlot WHERE DayCode = 'MON' AND SequenceNbr = 6)   , '2609'   , '' 
) q 

這裏是SQLFiddle演示

你可以把它改寫這樣

INSERT INTO TimeSlotWorker (TimeSlotId, WorkerId, PostCode, CitySuburbName) 
SELECT TimeSlotId, 1, '2914', ''   FROM TimeSlot WHERE DayCode = 'MON' AND SequenceNbr = 1 UNION ALL 
SELECT TimeSlotId, 1, '2912', ''   FROM TimeSlot WHERE DayCode = 'MON' AND SequenceNbr = 2 UNION ALL 
SELECT TimeSlotId, 1, '2913', ''   FROM TimeSlot WHERE DayCode = 'MON' AND SequenceNbr = 2 UNION ALL 
SELECT TimeSlotId, 1, '2911', ''   FROM TimeSlot WHERE DayCode = 'MON' AND SequenceNbr = 2 UNION ALL 
SELECT TimeSlotId, 1, '2615', 'Charnwood' FROM TimeSlot WHERE DayCode = 'MON' AND SequenceNbr = 3 UNION ALL 
SELECT TimeSlotId, 1, '2615', 'Dunlop' FROM TimeSlot WHERE DayCode = 'MON' AND SequenceNbr = 3 UNION ALL 
SELECT TimeSlotId, 1, '2615', 'Florey' FROM TimeSlot WHERE DayCode = 'MON' AND SequenceNbr = 3 UNION ALL 
SELECT TimeSlotId, 1, '2615', 'Flynn'  FROM TimeSlot WHERE DayCode = 'MON' AND SequenceNbr = 3 UNION ALL 
SELECT TimeSlotId, 1, '2615', 'Fraser' FROM TimeSlot WHERE DayCode = 'MON' AND SequenceNbr = 3 UNION ALL 
SELECT TimeSlotId, 1, '2615', 'Higgins' FROM TimeSlot WHERE DayCode = 'MON' AND SequenceNbr = 3 UNION ALL 
SELECT TimeSlotId, 1, '2615', 'Holt'  FROM TimeSlot WHERE DayCode = 'MON' AND SequenceNbr = 3 UNION ALL 
SELECT TimeSlotId, 1, '2615', 'Kippax' FROM TimeSlot WHERE DayCode = 'MON' AND SequenceNbr = 3 UNION ALL 
SELECT TimeSlotId, 1, '2615', 'Latham' FROM TimeSlot WHERE DayCode = 'MON' AND SequenceNbr = 3 UNION ALL 
SELECT TimeSlotId, 1, '2615', 'Macgregor' FROM TimeSlot WHERE DayCode = 'MON' AND SequenceNbr = 3 UNION ALL 
SELECT TimeSlotId, 1, '2615', 'Melba'  FROM TimeSlot WHERE DayCode = 'MON' AND SequenceNbr = 3 UNION ALL 
SELECT TimeSlotId, 1, '2615', 'Spence' FROM TimeSlot WHERE DayCode = 'MON' AND SequenceNbr = 3 UNION ALL 
SELECT TimeSlotId, 1, '2614', 'Aranda' FROM TimeSlot WHERE DayCode = 'MON' AND SequenceNbr = 3 UNION ALL 
SELECT TimeSlotId, 1, '2614', 'Cook'  FROM TimeSlot WHERE DayCode = 'MON' AND SequenceNbr = 3 UNION ALL 
SELECT TimeSlotId, 1, '2617', ''   FROM TimeSlot WHERE DayCode = 'MON' AND SequenceNbr = 4 UNION ALL 
SELECT TimeSlotId, 1, '2602', ''   FROM TimeSlot WHERE DayCode = 'MON' AND SequenceNbr = 5 UNION ALL 
SELECT TimeSlotId, 1, '2612', ''   FROM TimeSlot WHERE DayCode = 'MON' AND SequenceNbr = 5 UNION ALL 
SELECT TimeSlotId, 1, '2609', ''   FROM TimeSlot WHERE DayCode = 'MON' AND SequenceNbr = 6 

這裏是SQLFiddle演示

+0

謝謝,從@ GolezTrol的回答那裏得到了答案。 「UNION ALL」是否「屬於」它後面的SELECT或者它之前的那個?只是好奇,因爲前者我更喜歡我的佈局,但後者是你的。 –

+0

由於您使用'SELECT TimeSlotId FROM TimeSlot ...'來獲取標量值以及您在此選擇後指定的其他值,因此您需要將其包含在外部選擇中,並且'UNION ALL'子句屬於該選項外部SELECTs。在後面的例子中,所有的常量值被帶入到'SELECT ... FROM TimeSlot ...'中,因此你不需要一個外部選擇和'UNION ALL'屬於這些SELECT。 – peterm

+0

UNION ALL不屬於任何一個,或它屬於兩者。它將兩個查詢鏈接在一起,所以如果沒有兩個查詢,UNION ALL就不能存在。 – GolezTrol