Mysql
 sql >> база данни >  >> RDS >> Mysql

Превъртане през набори от резултати в MySQL

Нещо подобно трябва да свърши работа (Въпреки това, прочетете след фрагмента за повече информация)

CREATE PROCEDURE GetFilteredData()
BEGIN
  DECLARE bDone INT;

  DECLARE var1 CHAR(16);    -- or approriate type
  DECLARE Var2 INT;
  DECLARE Var3 VARCHAR(50);

  DECLARE curs CURSOR FOR  SELECT something FROM somewhere WHERE some stuff;
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET bDone = 1;

  DROP TEMPORARY TABLE IF EXISTS tblResults;
  CREATE TEMPORARY TABLE IF NOT EXISTS tblResults  (
    --Fld1 type,
    --Fld2 type,
    --...
  );

  OPEN curs;

  SET bDone = 0;
  REPEAT
    FETCH curs INTO var1,, b;

    IF whatever_filtering_desired
       -- here for whatever_transformation_may_be_desired
       INSERT INTO tblResults VALUES (var1, var2, var3 ...);
    END IF;
  UNTIL bDone END REPEAT;

  CLOSE curs;
  SELECT * FROM tblResults;
END

Няколко неща, които трябва да имате предвид...

Относно горния фрагмент:

  • може да искате да прехвърлите част от заявката към Съхранената процедура, може би по-специално критериите за търсене, за да я направи по-обща.
  • Ако този метод трябва да бъде извикан от множество сесии и т.н., може да искате да подадете идентификатор на сесия, за да създадете уникално име на временна таблица (всъщност ненужно притеснение, тъй като различните сесии не споделят едно и също пространство от имена на временен файл; вижте коментара от Грубер, по-долу)
  • Няколко части, като декларациите на променливи, заявката SELECT и т.н., трябва да бъдат правилно посочени

По-общо:опитвате се да избегнете нуждата от курсор .

Нарочно нарекох променливата на курсора curs[e], защото курсорите са смесена благословия. Те могат да ни помогнат да внедрим сложни бизнес правила, които може да са трудни за изразяване в декларативната форма на SQL, но след това ни кара да използваме процедурната (императивна) форма на SQL, която е обща характеристика на SQL, която не е нито много приятелска/ изразителен, програмен и често по-малко ефективен по отношение на производителността.

Може би можете да разгледате изразяването на желаната трансформация и филтриране в контекста на „обикновена“ (декларативна) SQL заявка.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. phpMyBackupPro – Уеб базиран инструмент за архивиране на MySQL за Linux

  2. FORMAT() Примери в MySQL

  3. Актуализирайте една MySQL таблица със стойности от друга

  4. актуализиране на няколко реда, използвайки лимит в mysql?

  5. Как да запазите обратната наклонена черта при избягване на кавички в MySQL – QUOTE()