Sql 查询正在提供笛卡尔连接
我有下面的查询,它返回大约65000行 如果上面的with子句查询我在现有的大查询中使用了两次,那么我如何在不使用with子句的情况下进行同样的操作呢。我在下面做了,但它不起作用。 任何最小的建议都将不胜感激 我使用了两次with子句查询变量。由于某些原因,我必须删除with子句并重新创建查询。因为这个变量已经用不同的别名引用了两次,所以我在下面写下了查询,并用不同的别名使用了两次表Sql 查询正在提供笛卡尔连接,sql,oracle,oracle11g,Sql,Oracle,Oracle11g,我有下面的查询,它返回大约65000行 如果上面的with子句查询我在现有的大查询中使用了两次,那么我如何在不使用with子句的情况下进行同样的操作呢。我在下面做了,但它不起作用。 任何最小的建议都将不胜感激 我使用了两次with子句查询变量。由于某些原因,我必须删除with子句并重新创建查询。因为这个变量已经用不同的别名引用了两次,所以我在下面写下了查询,并用不同的别名使用了两次表 select count(*) from( SELECT k.inventory
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的记录。我的连接条件正确吗?我需要与with子句查询相同的输出
基本上,我必须参考这两张表两次
非常感谢您的建议。您已经加入了k和t,您也加入了k1和t1,但您还没有将这两对连接在一起,因此它们正在创建交叉连接,您的查询有效:
选择计数*
从…起
选择k.存货\项目\标识作为存货\项目\标识,
k、 组织id作为组织id,
k、 主计量单位代码作为主计量单位代码,
k、 连接的_段作为连接的_段,
t、 描述作为描述,
t、 作为语言的语言
来自mtl_系统_项目_b_kfv k
内部连接mtl\u系统\u项目\u TLT
在k.inventory\u item\u id=t.inventory\u item\u id上
k.organization\u id=t.organization\u id
交叉连接mtl_系统_项目_b_kfv k1
内部连接mtl\u系统\u项目\u tl t1
在k1.inventory\u item\u id=t1.inventory\u item\u id上
k1.organization\u id=t1.organization\u id
;
您需要了解如何关联k/t对和k1/t1对,并将交叉连接更改为内部连接。然而,您的问题中没有足够的信息让我们告诉您如何做到这一点;您将需要确定要关联的列
比如:
选择计数*
从…起
选择k.存货\项目\标识作为存货\项目\标识,
k、 组织id作为组织id,
k、 主计量单位代码作为主计量单位代码,
k、 连接的_段作为连接的_段,
t、 描述作为描述,
t、 作为语言的语言
来自mtl_系统_项目_b_kfv k
内部连接mtl\u系统\u项目\u TLT
在k.inventory\u item\u id=t.inventory\u item\u id上
k.organization\u id=t.organization\u id
内部连接mtl\U系统项目\U b\U kfv k1-更改为内部
在k.some_column=k1.some_column上-添加了连接条件
内部连接mtl\u系统\u项目\u tl t1
在k1.inventory\u item\u id=t1.inventory\u item\u id上
k1.organization\u id=t1.organization\u id
t.some_other_column=t1.some_other_column-添加了一个连接条件
;
我使用了两次with子句查询变量。由于某些原因,我必须删除with子句并重新创建查询
当您应该解决原始问题,而不是试图绕过第一个问题来解决次要问题时,这似乎是一个XY问题。我的建议是解决如何绕过这个限制,这样您只需要查询表一次,就可以避免自联接;但是,同样,您没有提供任何详细信息,因此我们无法提供任何帮助建议。您加入了k和t,您也加入了k1和t1,但您没有将这两对连接在一起,因此它们正在创建交叉连接,您的查询有效:
选择计数*
从…起
选择k.存货\项目\标识作为存货\项目\标识,
k、 组织id作为组织id,
k、 主计量单位代码作为主计量单位代码,
k、 连接的_段作为连接的_段,
t、 描述作为描述,
t、 作为语言的语言
来自mtl_系统_项目_b_kfv k
内部连接mtl\u系统\u项目\u TLT
在k.inventory\u item\u id=t.inventory\u item\u id上
k.organization\u id=t.organization\u id
交叉连接mtl_系统_项目_b_kfv k1
内部连接mtl\u系统\u项目\u tl t1
在k1.inventory\u item\u id=t1.inventory\u item\u id上
k1.organization\u id=t1.organization\u id
;
您需要了解如何关联k/t对和k1/t1对,并将交叉连接更改为内部连接。然而,您的问题中没有足够的信息让我们告诉您如何做到这一点;您将需要确定要关联的列
比如:
选择计数*
从…起
选择k.存货\项目\标识作为存货\项目\标识,
k、 组织id作为组织id,
k、 主计量单位代码作为主计量单位代码,
k、 连接的_段作为连接的_段,
t、 描述作为描述,
t、 作为语言的语言
来自mtl_系统_项目_b_kfv k
内部连接mtl\u系统\u项目\u TLT
在k.inventory\u item\u id=t.inventory\u item\u id上
k.organization\u id=t.organization\u id
内部连接mtl\U系统项目\U b\U kfv k1-更改为内部
在k.some_column=k1.some_column上-添加了连接条件
内部连接mtl\u系统\u项目\u tl t1
在k1.inventory\u item\u id=t1.inventory\u item\u id上
k1.organization\u id=t1.organization\u id
t.some_other_column=t1.some_other_column-添加了一个连接条件
;
我使用了两次with子句查询变量。由于某些原因,我必须删除with子句并重新创建查询
当您应该解决原始问题,而不是试图绕过第一个问题来解决次要问题时,这似乎是一个XY问题。我的建议是解决如何绕过这个限制,这样您只需要查询表一次,就可以避免自联接;但是,同样,您没有提供任何详细信息,因此我们无法提供任何帮助建议。-25年前,在ANSI-92 SQL标准中,旧样式的逗号分隔表样式被正确的ANSI连接语法所取代,因此不鼓励使用Hanks Marc。链接非常有用。请写下你的查询以使用显式连接,不要忘记链接k与k1和/或t与t1:谢谢Arvo。现有连接条件是否正确?我只需要再添加2个和子句..对吗?@ShrutiSharma。不可以。在连接n个表的查询中,应该有n-1 ON子句。在FROM子句中使用逗号只会导致您遇到的问题类型。-25多年前,在ANSI-92 SQL标准中,旧样式的逗号分隔表列表样式被正确的ANSI连接语法所取代,因此不鼓励使用Hanks-Marc。链接非常有用。请写下你的查询以使用显式连接,不要忘记链接k与k1和/或t与t1:谢谢Arvo。现有连接条件是否正确?我只需要再添加2个和子句..对吗?@ShrutiSharma。不可以。在连接n个表的查询中,应该有n-1 ON子句。在FROM子句中使用逗号只会导致您遇到的问题类型。非常感谢。可悲的是,我不能提高投票率,因为我没有最低15票的要求。今天我得到了15票,所以提高了投票率。这个答案对我帮助很大:非常感谢。可悲的是,我不能提高投票率,因为我没有最低15票的要求。今天我得到了15票,所以提高了投票率。这个答案对我帮助很大:
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
);