这是更新的方案,希望这比上一个版本更清晰。
表1显示了此流程的所有数据,包含大约500万条记录。
`table1`
ID Forename Surname Tel Source Optin DistributedDate
1 A Test 0131 TL037 NULL NULL
2 B Test 0141 TL035 NULL NULL
v v v v v v v
表2通过插入脚本进行更新,并包含一段时间内使用的不同源列表,这可以很容易地由视图创建。
INSERT INTO table2(`Sourcecode`)
(SELECT DISTINCT(a.`Sourcecode`) FROM `table1` a)
`table2 - structure`
ID Sourcecode
1 TL037
2 TL031
3 TL004
4 TL029
5 TL035
我现在试图从表2中删除每个不同来源的5个随机记录的详细信息,并将这些详细信息插入表3中。
`table3 - structure`
ID Forename Surname Tel Source Optin DistributedDate
NULL NULL NULL NULL NULL NULL NULL
这是我到目前为止创建的代码:
SET @Sourcecode =
(SELECT b.`Sourcecode`
FROM `table2` b
WHERE b.id = b.id
AND b.`Sourcecode` NOT IN (SELECT DISTINCT(source) FROM `table3`)
LIMIT 1);
INSERT INTO table3.*
(SELECT
a.id AS 'ID',
a.`FirstName` AS 'Forename',
a.`Surname` AS 'Surname',
a.`TelephoneNumber2` AS 'Tel',
a.`SourceCode` AS 'Source',
a.`optin` AS 'Optin',
a.`DateExported` AS 'DistributedDate'
FROM `table1`
WHERE a.`SourceCode` = @SourceCode
ORDER BY RAND(a.sourcecode)
LIMIT 5
基本上我正在寻找的最终结果是从@Sourcecode的结果集中自动多次运行上述查询,直到value为NULL。
我已经尝试使用循环功能,但我没有太多运气。
答案 0 :(得分:0)
您可以创建如下视图:
CREATE VIEW query1 AS
SELECT DISTINCT(b.`source`)
FROM `table2` b
然后从View收集:
SELECT *
FROM `table1` a
WHERE a.`source` IN(DISTINCT(b.`source`) FROM `query1` b)
ORDER BY RAND(a.id)
LIMIT 5)
我自己没有测试过,如果这不起作用,请提供一些来源和预期的数据。
答案 1 :(得分:0)
试试这个:
SELECT a.id, A2.RAND_NUMBER
FROM `table1` a, (SELECT DISTINCT(b.`source`)
,ABS(CHECKSUM(NewId())) % @INT AS RAND_NUMBER
FROM `table2` b) AS A2
WHERE A2.RAND_NUMBER BETWEEN 1 AND 5
GROUP BY a.id, A2.RAND_NUMBER
ORDER BY RAND(a.id)