查询给出笛卡尔连接
Query is giving cartesian join
我有以下查询,它返回大约 65000
行。
WITH msilk AS (
SELECT
k.inventory_item_id AS inventory_item_id,
k.organization_id AS organization_id,
k.primary_uom_code AS primary_uom_code,
k.concatenated_segments AS concatenated_segments,
t.description AS description,
t.language AS language
FROM
mtl_system_items_b_kfv k,
mtl_system_items_tl t
WHERE
k.inventory_item_id = t.inventory_item_id
AND k.organization_id = t.organization_id)
select * from msilk;
如果上面的 with 子句查询我在现有的大查询中使用了两次,我如何在不使用 with 子句的情况下做同样的事情。我在下面做了,但它不起作用。
任何最小的建议都将不胜感激。
这个with clause query
变量我用了两次。由于某种原因,我必须删除 with 子句并重新创建查询。因为这个变量已经用不同的别名被引用了两次,所以我在下面写查询并使用 table 两次不同的别名
select count(*) from( SELECT
k.inventory_item_id AS inventory_item_id,
k.organization_id AS organization_id,
k.primary_uom_code AS primary_uom_code,
k.concatenated_segments AS concatenated_segments,
t.description AS description,
t.language AS language
FROM
mtl_system_items_b_kfv k,
mtl_system_items_b_kfv k1,
mtl_system_items_tl t,
mtl_system_items_tl t1
WHERE
k.inventory_item_id = t.inventory_item_id and
k1.inventory_item_id = t1.inventory_item_id AND
k.organization_id = t.organization_id and
k1.organization_id = t1.organization_id
);
这也应该提供 65k 条记录,但它提供了大约 840k 条记录。我的加入条件是否正确?我需要与子句查询相同的输出。
基本上我必须参考两个 table 两次。
非常感谢任何建议。
您加入了 k
和 t
并且您还加入了 k1
和 t1
但您没有将这两对组合在一起所以他们正在创建 CROSS JOIN
并且您的查询有效:
select count(*)
from (
SELECT k.inventory_item_id AS inventory_item_id,
k.organization_id AS organization_id,
k.primary_uom_code AS primary_uom_code,
k.concatenated_segments AS concatenated_segments,
t.description AS description,
t.language AS language
FROM mtl_system_items_b_kfv k
INNER JOIN mtl_system_items_tl t
ON ( k.inventory_item_id = t.inventory_item_id
AND k.organization_id = t.organization_id
)
CROSS JOIN mtl_system_items_b_kfv k1
INNER JOIN mtl_system_items_tl t1
ON ( k1.inventory_item_id = t1.inventory_item_id
AND k1.organization_id = t1.organization_id )
);
您需要弄清楚如何关联 k
/t
对和 k1
/t1
对并将 CROSS JOIN
更改为一个 INNER JOIN
。但是,您的问题中没有足够的信息让我们告诉您如何去做;您需要确定要关联的列。
类似于:
select count(*)
from (
SELECT k.inventory_item_id AS inventory_item_id,
k.organization_id AS organization_id,
k.primary_uom_code AS primary_uom_code,
k.concatenated_segments AS concatenated_segments,
t.description AS description,
t.language AS language
FROM mtl_system_items_b_kfv k
INNER JOIN mtl_system_items_tl t
ON ( k.inventory_item_id = t.inventory_item_id
AND k.organization_id = t.organization_id
)
INNER JOIN JOIN mtl_system_items_b_kfv k1 -- changed to INNER
ON ( k.some_column = k1.some_column ) -- added a join condition
INNER JOIN mtl_system_items_tl t1
ON ( k1.inventory_item_id = t1.inventory_item_id
AND k1.organization_id = t1.organization_id
AND t.some_other_column = t1.some_other_column ) -- added a join condition
);
This with clause query
variable I am using twice. Due to some reason i have to remove with clause and recreate the query.
当您应该解决原始问题而不是尝试绕过第一个问题而产生的次要问题时,这似乎是一个 XY 问题。我的建议是想办法绕过这个限制,这样你只需要查询一次 table 就可以避免自连接;但是,同样,您没有提供任何详细信息,因此我们无法提供任何帮助建议。
我有以下查询,它返回大约 65000
行。
WITH msilk AS (
SELECT
k.inventory_item_id AS inventory_item_id,
k.organization_id AS organization_id,
k.primary_uom_code AS primary_uom_code,
k.concatenated_segments AS concatenated_segments,
t.description AS description,
t.language AS language
FROM
mtl_system_items_b_kfv k,
mtl_system_items_tl t
WHERE
k.inventory_item_id = t.inventory_item_id
AND k.organization_id = t.organization_id)
select * from msilk;
如果上面的 with 子句查询我在现有的大查询中使用了两次,我如何在不使用 with 子句的情况下做同样的事情。我在下面做了,但它不起作用。 任何最小的建议都将不胜感激。
这个with clause query
变量我用了两次。由于某种原因,我必须删除 with 子句并重新创建查询。因为这个变量已经用不同的别名被引用了两次,所以我在下面写查询并使用 table 两次不同的别名
select count(*) from( SELECT
k.inventory_item_id AS inventory_item_id,
k.organization_id AS organization_id,
k.primary_uom_code AS primary_uom_code,
k.concatenated_segments AS concatenated_segments,
t.description AS description,
t.language AS language
FROM
mtl_system_items_b_kfv k,
mtl_system_items_b_kfv k1,
mtl_system_items_tl t,
mtl_system_items_tl t1
WHERE
k.inventory_item_id = t.inventory_item_id and
k1.inventory_item_id = t1.inventory_item_id AND
k.organization_id = t.organization_id and
k1.organization_id = t1.organization_id
);
这也应该提供 65k 条记录,但它提供了大约 840k 条记录。我的加入条件是否正确?我需要与子句查询相同的输出。
基本上我必须参考两个 table 两次。
非常感谢任何建议。
您加入了 k
和 t
并且您还加入了 k1
和 t1
但您没有将这两对组合在一起所以他们正在创建 CROSS JOIN
并且您的查询有效:
select count(*)
from (
SELECT k.inventory_item_id AS inventory_item_id,
k.organization_id AS organization_id,
k.primary_uom_code AS primary_uom_code,
k.concatenated_segments AS concatenated_segments,
t.description AS description,
t.language AS language
FROM mtl_system_items_b_kfv k
INNER JOIN mtl_system_items_tl t
ON ( k.inventory_item_id = t.inventory_item_id
AND k.organization_id = t.organization_id
)
CROSS JOIN mtl_system_items_b_kfv k1
INNER JOIN mtl_system_items_tl t1
ON ( k1.inventory_item_id = t1.inventory_item_id
AND k1.organization_id = t1.organization_id )
);
您需要弄清楚如何关联 k
/t
对和 k1
/t1
对并将 CROSS JOIN
更改为一个 INNER JOIN
。但是,您的问题中没有足够的信息让我们告诉您如何去做;您需要确定要关联的列。
类似于:
select count(*)
from (
SELECT k.inventory_item_id AS inventory_item_id,
k.organization_id AS organization_id,
k.primary_uom_code AS primary_uom_code,
k.concatenated_segments AS concatenated_segments,
t.description AS description,
t.language AS language
FROM mtl_system_items_b_kfv k
INNER JOIN mtl_system_items_tl t
ON ( k.inventory_item_id = t.inventory_item_id
AND k.organization_id = t.organization_id
)
INNER JOIN JOIN mtl_system_items_b_kfv k1 -- changed to INNER
ON ( k.some_column = k1.some_column ) -- added a join condition
INNER JOIN mtl_system_items_tl t1
ON ( k1.inventory_item_id = t1.inventory_item_id
AND k1.organization_id = t1.organization_id
AND t.some_other_column = t1.some_other_column ) -- added a join condition
);
This
with clause query
variable I am using twice. Due to some reason i have to remove with clause and recreate the query.
当您应该解决原始问题而不是尝试绕过第一个问题而产生的次要问题时,这似乎是一个 XY 问题。我的建议是想办法绕过这个限制,这样你只需要查询一次 table 就可以避免自连接;但是,同样,您没有提供任何详细信息,因此我们无法提供任何帮助建议。