Поэтому я собираюсь создать дамп данных всех табличных данных, которые связаны с идентификатором клиента - и мне не разрешено использовать представления ...
Я новичок в MYSQL и все еще пытаюсьчтобы разобраться в логике.
Я создал несколько временных таблиц, чтобы все таблицы и все клиенты / поставщики (поставщики - это следующий шаг ... Сначала мне нужно исправить клиентов) подключились кcustomerID.
Как разработчик, я думал, что когда я выполняю внутреннее соединение в каждом цикле, финальная таблица получит все результаты, прикрепленные к нему, но когда я пытаюсь объединить значения, моя финальная таблица никогда не изменяется,Проблема должна быть где-то в точке 17, я думаю ...
-- 1. Set current database
USE customer;
-- 2. Set variables
SET @customer = 'acmemax';
SET @domain = '%@acmemax.com';
-- 3. Get customer acmemax
DROP TEMPORARY TABLE IF EXISTS temporaryCustomerTable;
CREATE TEMPORARY TABLE temporaryCustomerTable
SELECT id
FROM customer.Customer
WHERE id = @customer
OR hierarchyId = @customer
OR hierarchyId LIKE CONCAT(@customer, '|%')
-- 4. Get any of customer acmemax child entities
OR hierarchyId LIKE CONCAT('|%', @customer)
OR hierarchyId LIKE CONCAT('|%', @customer, '|%');
-- 5. Get any supplier that has a businesslink to any of above acmemax customers
DROP TEMPORARY TABLE IF EXISTS temporarySupplierTable;
CREATE TEMPORARY TABLE temporarySupplierTable
SELECT bln.supplierId AS id
FROM supplier.Supplier AS spl
INNER JOIN `business-link`.BusinessLink AS bln
ON spl.id = bln.supplierId
INNER JOIN customer.temporaryCustomerTable AS tct
ON tct.id = bln.customerId;
-- 6. Get any supplier that has a user assigned that uses an acmemax.com email address
DROP TEMPORARY TABLE IF EXISTS temporaryAssignedSupplierTable;
CREATE TEMPORARY TABLE temporaryAssignedSupplierTable
SELECT spl.id AS id
FROM user.User AS usr
INNER JOIN supplier.Supplier AS spl
ON spl.id = usr.supplierId
WHERE usr.id LIKE @domain;
-- 7. Merge tables as idTable
DROP TEMPORARY TABLE IF EXISTS idTable;
CREATE TEMPORARY TABLE idTable
SELECT ID
FROM temporaryCustomerTable
UNION ALL
SELECT ID
FROM temporarySupplierTable
UNION ALL
SELECT ID
FROM temporaryAssignedSupplierTable;
-- 8. Temporary table of suppliers in DB
DROP TEMPORARY TABLE IF EXISTS allSupplierTables;
CREATE TEMPORARY TABLE allSupplierTables
SELECT DISTINCT CONCAT('`', constraints.TABLE_SCHEMA, '`.`', columns.TABLE_NAME, '`') content
FROM information_schema.COLUMNS as columns
RIGHT JOIN information_schema.TABLE_CONSTRAINTS as constraints
ON columns.TABLE_NAME = constraints.TABLE_NAME
WHERE columns.COLUMN_NAME = 'supplierId'
AND constraints.TABLE_SCHEMA NOT LIKE 'mysql'
AND constraints.TABLE_SCHEMA NOT LIKE 'voucher';
-- 9. Temporary table of customers in DB
DROP TEMPORARY TABLE IF EXISTS allCustomerTables;
CREATE TEMPORARY TABLE allCustomerTables
SELECT DISTINCT CONCAT('`', constraints.TABLE_SCHEMA, '`.`', columns.TABLE_NAME, '`') content
FROM information_schema.COLUMNS as columns
RIGHT JOIN information_schema.TABLE_CONSTRAINTS as constraints
ON columns.TABLE_NAME = constraints.TABLE_NAME
WHERE columns.COLUMN_NAME = 'customerId'
AND constraints.TABLE_SCHEMA NOT LIKE 'mysql'
AND constraints.TABLE_SCHEMA NOT LIKE 'voucher';
-- 10. Get all customer data
DELIMITER $$
DROP PROCEDURE IF EXISTS GetAllCustomerData;
CREATE PROCEDURE GetAllCustomerData(IN tableName VARCHAR(255))
DETERMINISTIC
-- 11. Begin procedure to get all customer data
BEGIN
DECLARE currentTable VARCHAR(100);
DECLARE done INT DEFAULT 0;
-- 12. Declare cursor from temporary table
DECLARE cur_table CURSOR FOR SELECT content FROM temporaryTable;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
-- 13. Create temporary table for cursor
DROP TEMPORARY TABLE IF EXISTS temporaryTable;
SET @a = CONCAT('
CREATE TEMPORARY TABLE temporaryTable
SELECT DISTINCT content
FROM ', tableName
);
PREPARE stmt1 FROM @a;
EXECUTE stmt1;
-- 14. Create temporary table for all fetched data
DROP TEMPORARY TABLE IF EXISTS allData;
CREATE TEMPORARY TABLE allData
SELECT customer.*
FROM customer.Customer AS customer
INNER JOIN idTable
WHERE customer.id LIKE idTable.Id;
-- 15. Open cursor to fetch data
OPEN cur_table;
WHILE done = 0 DO
FETCH cur_table INTO currentTable;
-- 16. Create temporary table from current selected data
DROP TEMPORARY TABLE IF EXISTS currentSelectedTable;
SET @b = CONCAT('
CREATE TEMPORARY TABLE currentSelectedTable
SELECT ct.*
FROM ', currentTable,' AS ct;
');
PREPARE stmt2 FROM @b;
EXECUTE stmt2;
-- 17. Attach fetched data to output table
SET @c = CONCAT('
SELECT *
FROM allData
INNER JOIN currentSelectedTable
ON allData.id LIKE currentSelectedTable.customerId;
');
PREPARE stmt3 FROM @c;
EXECUTE stmt3;
END WHILE;
-- 18. Show complete output table
SELECT * FROM allData;
CLOSE cur_table;
END $$
DELIMITER ;
-- 19. Start procedure
CALL GetAllCustomerData('allCustomerTables');
Когда я запускаю это в Datagrid, я получаю 32 таблицы, в которых всегда есть данные customer.Customer в начале и соответствующие значениякаждой строки таблицы в конце, но последняя таблица «allData» по-прежнему содержит только данные из customer.Customer, который соответствует идентификатору customerTid IDTables, НИЧЕГО нового не добавляется.