關鍵詞:SqlServer
問題背景
- hql語句不熟悉,多表聯查的時候都是在業務層在寫其他的方法去查。(感覺真的好菜啊,但是還是要直面現實)。
- 測試的時候發現數據過濾的不對。有很多所謂的”重復"數據。以我項目中的兩個場景為例。
場景1
如圖化學品和類型是一對多的關系。如果按普通的左關聯查詢查到的數據應該是,每一個化學品有幾個類型就會有幾條數據。所以這里用到的是多行轉多列
--多行轉多列
SELECT O.CHEMICAL_ID,O.CAS,O.JC,
max(CASE O.DETAILS_NAME WHEN '重點監管' THEN O.TZLBBM ELSE 0 end)重點監管,
max(CASE O.DETAILS_NAME WHEN '易制毒' THEN O.TZLBBM ELSE 0 end)易制毒,
max(CASE O.DETAILS_NAME WHEN '易制爆' THEN O.TZLBBM ELSE 0 end)易制爆,
max(CASE O.DETAILS_NAME WHEN '劇毒化學品' THEN O.TZLBBM ELSE 0 end)劇毒化學品,
max(CASE O.DETAILS_NAME WHEN '高毒物品' THEN O.TZLBBM ELSE 0 end)高毒物品
FROM (SELECT C.*,E.DETAILS_NAME,T.TZLBBM FROM TB_BASE_CHEMICAL AS C
LEFT JOIN TB_BASE_CHEMICAL_TZLB AS T ON T.CHEMICAL_ID=C.CHEMICAL_ID
LEFT JOIN TB_HSE_DICTIONARY_DETAILS AS E ON E.DETAILS_CODE=T.TZLBBM AND E.COM_DEPTCODE='20000000')AS O
GROUP BY O.CHEMICAL_ID,O.CAS,O.JC
效果如圖
場景2
這里的化學品和類別也是一對多的關系,用到的多行轉一列。
用到了 stuff(select ',' + fieldname from tablename for xml path('')),1,1,'') 函數
這一整句的作用是將多行fieldname字段的內容串聯起來,用逗號分隔。
SELECT
qywhpglid ,typeName = ( STUFF(( SELECT ',' + typeName
FROM (
SELECT
a.QYWHPGL_ID AS qywhpglid,
g.DETAILS_NAME AS typeName
FROM
TB_HSE_FOUN_QYWHPGL a
INNER JOIN TB_BASE_CHEMICAL c ON a.WHPBM = c.CHECODE
INNER JOIN TB_BASE_CHEMICAL_TZLB f ON f.CHEMICAL_ID = c.CHEMICAL_ID
INNER JOIN TB_HSE_DICTIONARY_DETAILS g ON f.TZLBBM = g.DETAILS_CODE and g.ORGCODE='20000000'
WHERE
a.U_VALIDATE = '1'
)AS R
WHERE R.qywhpglid = Test.qywhpglid
FOR XML PATH('')), 1, 1, '') )
FROM
(
SELECT
a.QYWHPGL_ID AS qywhpglid,
g.DETAILS_NAME AS typeName
FROM
TB_HSE_FOUN_QYWHPGL a
INNER JOIN TB_BASE_CHEMICAL c ON a.WHPBM = c.CHECODE
INNER JOIN TB_BASE_CHEMICAL_TZLB f ON f.CHEMICAL_ID = c.CHEMICAL_ID
INNER JOIN TB_HSE_DICTIONARY_DETAILS g ON f.TZLBBM = g.DETAILS_CODE and g.ORGCODE='20000000'
WHERE
a.U_VALIDATE = '1'
) AS Test
GROUP BY qywhpglid
注意:斜體加粗部分是兩個表,它們的主鍵和要合並的行是一樣的。如果不加上主鍵相等(標黃部分就會出現重復數據)