2013-04-03 89 views
0

我有一個從SQL Server遷移到MySQL的數據庫。我在SQL Server中有一個現有的查詢來獲取關係不爲null的列的值,我的意思是,如果兩個表之間的關係爲null,那麼這意味着應該與另一個表有關係。獲取關係不爲NULL的列

這是我用的是查詢:

SELECT C.expediente, 
     C.status, 
     Sum(M.monto)        AS monto, 
     Sum(M.interes)       AS interes, 
     Sum(M.iva)        AS iva, 
     Sum(M.capital)       AS capital, 
     M.fecha_mov, 
     AB.tipo_abono, 
     AB.id_deposito, 
     Isnull(Min(tg.nombre), Min(tp.nombcomp)) AS nombreGrupo 
FROM movimientos AS M 
     JOIN acreditados AS A 
     ON A.id_acreditado = M.id_acreditado 
     JOIN creditos AS C 
     ON C.id_credito = A.id_credito 
     JOIN abonos AS AB 
     ON AB.id_movimiento = M.id_movimiento 
     OUTER apply (SELECT TOP 1 G.nombre 
        FROM grupos G 
        WHERE G.id_credito = C.id_credito) tg 
     OUTER apply (SELECT TOP 1 P.nombres + ' ' + P.apellido_paterno + ' ' 
           + P.apellido_materno AS NombComp 
        FROM personas P 
        WHERE A.id_persona = P.id_persona) tp 
GROUP BY M.fecha_mov, 
      AB.tipo_abono, 
      AB.id_deposito, 
      C.expediente, 
      C.status 
ORDER BY M.fecha_mov 

但似乎MySQL有沒有OUTER APPLYISNULL。我怎樣才能把這個查詢翻譯成MySQL?

+0

我不太確定OUTER APPLY,但對於ISNULL,你試過IS NULL(有空格)嗎? – Infiltrator

+0

我試過,但MySQL IS NULL只評估一個表達式,也許COALESCE函數做的伎倆,但我仍然堅持外部應用部分 –

+0

問題,你從表'grupos'和'personas'得到什麼?隨機記錄每個'id_credito'和'id_persona',分別? –

回答

1

你有幾個問題需要檢討:

1 - 該APPLY手術者沒有在MySQL的支持。但是,根據您的使用情況,您可能只需使用LEFT OUTER JOIN即可。

2 - MySQL不支持TOP。相反,請使用LIMIT。但是,我不認爲你在這種情況下需要它,因爲你正在使用這些字段中的每一個的MIN

3 - 要連接MySQL中的字符串,請使用CONCAT"+"

4 - 最後,我更喜歡在MySQL中使用COALESCE來檢查NULLs。還有其他選擇。

所以把他們放在一起,這應該是接近(未經測試):

SELECT C.expediente, 
     C.status, 
     Sum(M.monto)        AS monto, 
     Sum(M.interes)       AS interes, 
     Sum(M.iva)        AS iva, 
     Sum(M.capital)       AS capital, 
     M.fecha_mov, 
     AB.tipo_abono, 
     AB.id_deposito, 
     COALESCE(MIN(tg.nombre), MIN(tp.nombcomp)) AS nombreGrupo 
FROM movimientos AS M 
     JOIN acreditados AS A 
     ON A.id_acreditado = M.id_acreditado 
     JOIN creditos AS C 
     ON C.id_credito = A.id_credito 
     JOIN abonos AS AB 
     ON AB.id_movimiento = M.id_movimiento 
     LEFT OUTER JOIN (
      SELECT id_credito, nombre 
      FROM grupos 
      ) tg ON tg.id_credito = C.id_credito 
     LEFT OUTER JOIN (
      SELECT id_persona, CONCAT(nombres,' ',apellido_paterno,' ',apellido_materno) AS NombComp 
      FROM personas 
      ) tp ON A.id_persona = tp.id_persona 
GROUP BY M.fecha_mov, 
      AB.tipo_abono, 
      AB.id_deposito, 
      C.expediente, 
      C.status 
ORDER BY M.fecha_mov 

你可能不需要一些這些領域在你的GROUP BY - 只是你DISTINCT所需的字段。

+0

謝謝你這樣一個完整的答案,我測試了查詢,它的工作。 –

+0

@JorgeZapata - np,很高興我能幫上忙! – sgeddes

1

我覺得這把它變成一個有效的MySQL查詢:

SELECT C.expediente, C.status, Sum(M.monto) AS monto, Sum(M.interes) as interes, 
     Sum(M.iva) as iva, Sum(M.capital) as capital, 
     M.fecha_mov, AB.tipo_abono, AB.id_deposito, 
     coalesce(Min(tg.nombre), Min(tp.nombcomp)) AS nombreGrupo 
FROM movimientos M join 
     acreditados A 
     ON A.id_acreditado = M.id_acreditado join 
     creditos C 
     ON C.id_credito = A.id_credito join 
     abonos AB 
     ON AB.id_movimiento = M.id_movimiento join 
     (select g.id_credito, max(g.nombre) -- arbitrary nombre 
     from grupos g 
     group by g.id_credito 
     ) tg 
     on tG.id_credito = C.id_credito join 
     (SELECT P.id_persona, concat_ws(' ', P.nombres, P.apellido_paterno, P.apellido_materno) AS NombComp 
     FROM personas P 
     group by p.id_persona 
     ) tp 
     on A.id_persona = tP.id_persona 
GROUP BY M.fecha_mov, AB.tipo_abono, AB.id_deposito, C.expediente, C.status 
ORDER BY M.fecha_mov 

我更換了isnull()coalesce() - 如果你的數據庫之間正在進行,使用標準的SQL在可能的情況。我將+替換爲concat_ws()。注意有一個小的差異。 。 。如果其中一個字段爲NULL,那麼MySQL的值將被視爲「'。

我用集合取代了cross apply。您使用top 1而不使用order by,因此它會讀取任意行。所以,這個版本任意選擇最大值。

+0

+1用於提示SQL標準 –