我的MySQL数据库中有一个表compatibility_core_rules
,它基本上存储了一对id,它们表示具有相应id的字段的部分之间的兼容性。现在,我的目标是通过遵循对的传递性来获得所有可能的兼容性对(例如,如果表具有(1,2)和(2,4),则添加对(1,4))。所以,从数学上讲,我试图找到compatibility_core_rules
表的传递闭包。
E.g。如果compatibility_core_rules
包含(1,2),(2,4)和(4,9),那么最初我们可以看到(1,2)和(2,4)给出一对新的(1,4) )。然后我迭代更新的对,发现(4,9)新添加的(1,4)给了我(1,9)。此时,再次迭代将不再添加对。
所以我的方法是创建一个包含来自compatibility_core_rules
的初始对的视图,如下所示:
CREATE VIEW compatibility_core_rules_closure
AS
SELECT part_type_field_values_id_a,
part_type_field_values_id_b,
custom_builder_id
FROM compatibility_core_rules;
然后,为了迭代发现所有对,我需要继续用自己的更新版本替换该视图,每次都有额外的对。但是,我发现MySQL并不像我在自己的定义中引用视图那样,所以我做了一个临时视图(带或替换,因为这将在循环内):
CREATE OR REPLACE VIEW compatibility_core_rules_closure_temp
AS
SELECT part_type_field_values_id_a,
part_type_field_values_id_b,
custom_builder_id
FROM compatibility_core_rules_closure;
这里没问题。然后,我在以下CREATE OR REPLACE VIEW语句中引用此临时视图,以使用一次迭代的额外对更新compatibility_core_rules_closure
视图:
CREATE OR REPLACE VIEW compatibility_core_rules_closure
AS
SELECT
CASE WHEN ccr1.part_type_field_values_id_a = ccr2.part_type_field_values_id_a THEN ccr1.part_type_field_values_id_b
WHEN ccr1.part_type_field_values_id_a = ccr2.part_type_field_values_id_b THEN ccr1.part_type_field_values_id_b
END ccrA,
CASE WHEN ccr1.part_type_field_values_id_a = ccr2.part_type_field_values_id_a THEN ccr2.part_type_field_values_id_b
WHEN ccr1.part_type_field_values_id_a = ccr2.part_type_field_values_id_b THEN ccr2.part_type_field_values_id_a
END ccrB,
ccr1.custom_builder_id custom_builder_id
FROM compatibility_core_rules_closure_temp ccr1
INNER JOIN compatibility_core_rules_closure_temp ccr2
ON (
ccr1.part_type_field_values_id_a = ccr2.part_type_field_values_id_a OR
ccr1.part_type_field_values_id_a = ccr2.part_type_field_values_id_b
)
GROUP BY ccrA,
ccrB
HAVING -- ccrA and ccrB are in fact not the same
ccrA != ccrB
-- ccrA and ccrB do not belong to the same part type
AND (
SELECT ptf.part_type_id
FROM part_type_field_values ptfv
INNER JOIN part_type_fields ptf
ON ptfv.part_type_field_id = ptf.id
WHERE ptfv.id = ccrA
LIMIT 1
) !=
(
SELECT ptf.part_type_id
FROM part_type_field_values ptfv
INNER JOIN part_type_fields ptf
ON ptfv.part_type_field_id = ptf.id
WHERE ptfv.id = ccrB
LIMIT 1
)
现在这是出问题的地方。我收到以下错误:
#1146 - Table 'db509574872.compatibility_core_rules_closure' doesn't exist
我对此错误消息感到非常困惑。我字面上刚刚创建了两个语句之前的视图/表。我确定SELECT查询本身是正确的,因为如果我自己尝试它并且运行正常。如果我将第一行更改为使用compatibility_core_rules_closure2
而不是compatibility_core_rules_closure
,那么它运行正常(但是,由于我需要一次又一次地重新更新同一视图,因此没有多大用处) 。我查看了SQL SECURITY条款,但没有取得任何成功。也在网上进行研究,但没有到达任何地方。
有没有人知道发生了什么以及如何解决它?
答案 0 :(得分:0)
MySQL不支持视图中的子查询。
你必须将它们分开......即。使用包含您主视图中的子查询的另一个视图。
为该视图运行create语句将呈现错误,而不是创建它,因此在查询时不会出现错误。