2013-01-09 68 views
2

使用HSLQDB(2.2.9)我使用java JDBC連接的數據庫。在不使用JOIN的情況下在HSQLDB中樞軸

某甲已接種疫苗的1和3,某乙已收到2和4 使用這個簡單的查詢:

SELECT std.*,vac.Date FROM Students AS std 
LEFT JOIN ValuesVaccination AS vac 
ON vac.ID_Students = std.ID 

我得到一個結果集,如:

ID | Name | ID_Vaccination | Date 
1 | PersonA | 1    | 2011-06-01 
1 | PersonA | 3    | 2012-03-21 
1 | PersonB | 2    | 2012-08-11 
2 | PersonB | 4    | 2012-09-08 

我想要得到的是:

ID | Name | Vaccination1 | Vaccination2 | Vaccination3 | Vaccination4 
1 | PersonA | 2011-06-01 | NULL  | 2012-03-21 | NULL 
2 | PersonB | NULL  | 2012-08-11 | NULL  | 2012-09-08 

一種方法是:

SELECT std.*, 
     vac1.Date AS "Vaccination1", 
     vac2.Date AS "Vaccination2", 
     vac3.Date AS "Vaccination3", 
     vac4.Date AS "Vaccination4" 
FROM Students AS std 
LEFT JOIN ValuesVaccination AS vac1 
ON vac1.ID_Students = std.ID AND vac1.ID_Vaccinations = 1 
LEFT JOIN ValuesVaccination AS vac2 
ON vac2.ID_Students = std.ID AND vac2.ID_Vaccinations = 2 
LEFT JOIN ValuesVaccination AS vac3 
ON vac3.ID_Students = std.ID AND vac3.ID_Vaccinations = 3 
LEFT JOIN ValuesVaccination AS vac4 
ON vac4.ID_Students = std.ID AND vac4.ID_Vaccinations = 4 

問題是數不同的疫苗接種是可變。有沒有一種體面的方式來做到這一點,而不使用Java循環中的JOIN構建查詢?

我想通了PIVOT函數是我所需要的,但似乎HSQLDB不支持它並搜索stackoverflow和谷歌沒有提供有用的信息。

謝謝你的任何信息

回答

0

PIVOT是不是標準的SQL,它是一個擴展模塊,僅通過Microsoft SQL Server 2005(後來)語法的支持,Oracle 11g

這是一個使用標準的SQL,應該在任何RDBMS工作的解決方案:

SELECT s.ID, s.Name, 
    MAX(CASE WHEN ID_Vaccination=1 THEN Date END) AS Vaccination1, 
    MAX(CASE WHEN ID_Vaccination=2 THEN Date END) AS Vaccination2, 
    MAX(CASE WHEN ID_Vaccination=3 THEN Date END) AS Vaccination3, 
    MAX(CASE WHEN ID_Vaccination=4 THEN Date END) AS Vaccination4 
FROM Students AS s 
LEFT JOIN ValuesVaccination AS v 
    ON s.ID = v.ID_Students 
GROUP BY s.ID, s.Name; 

回覆您的評論:

SQL不允許的數據值在同一個動態生成新的列查詢。因此, 任何數據透視查詢要求您知道在準備查詢之前,您希望在輸出中顯示多少個不同的疫苗接種。

您可以運行兩個查詢:一個「發現」設定不同的接種值:

SELECT DISTINCT ID_Vaccination FROM ValuesVaccination; 

然後取這回應用程序,並遍歷它,添加列表達式,當您去,建立數據透視查詢。

唯一的選擇是獲取所有加入到學生的數據,如在您的第一個查詢中,並使用應用程序代碼將其後處理爲透視格式。

無論採用哪種方式,要生成動態數據透視查詢,必須在準備查詢之前或獲取結果之前用應用程序代碼對其進行補充。

+0

如果有10種不同的疫苗接種會怎麼樣?還是30?它們可以由應用程序用戶創建和刪除 – user1952162

+0

感謝您的回答,'MAX'函數正是我所需要的,因爲可以有多個值,我需要顯示最近的日期。 – user1952162

+0

'PIVOT'也受到Oracle的支持。 –

0

在比爾的回答中END)之後只有一個支架太多了。 要在這個線程使用別名和列名從原來的問題100%正確答案:

SELECT std.ID, std.Name, 
    MAX(CASE WHEN v.ID_Vaccinations=1 THEN Date END) AS Vaccination1, 
    MAX(CASE WHEN v.ID_Vaccinations=2 THEN Date END) AS Vaccination2, 
    MAX(CASE WHEN v.ID_Vaccinations=3 THEN Date END) AS Vaccination3, 
    MAX(CASE WHEN v.ID_Vaccinations=4 THEN Date END) AS Vaccination4 
FROM Students AS std 
LEFT JOIN ValuesVaccination AS v 
ON std.ID = v.ID_Students 
GROUP BY std.ID, std.Name 

返回所需的結果。

+0

謝謝,我編輯了我的答案來解決不平衡的parens。 –

相關問題