如何删除Oracle SQL查询中多个父表和子表的重复行
昨天我发布了一个关于oracle sql查询被重复的问题 如果我有多个父表和子表,如何使用JOIN修改SQL查询如何删除Oracle SQL查询中多个父表和子表的重复行,sql,oracle,join,Sql,Oracle,Join,昨天我发布了一个关于oracle sql查询被重复的问题 如果我有多个父表和子表,如何使用JOIN修改SQL查询 SELECT t1.table_id FROM TABLE_ONE t1, COMMON_TABLE cmn WHERE t1.table_name = 'TEST_ONE' AND t1.table_id = cmn.common_id AND cmn.column_one > 20 AND cmn.column_two <=
SELECT t1.table_id FROM TABLE_ONE t1, COMMON_TABLE cmn
WHERE
t1.table_name = 'TEST_ONE'
AND t1.table_id = cmn.common_id
AND cmn.column_one > 20
AND cmn.column_two <= 30
UNION
SELECT t2.table_id FROM TABLE_TWO t2, COMMON_TABLE cmn
WHERE
t2.table_name = 'TEST_TWO'
AND t2.table_id = cmn.common_id
AND cmn.column_one > 20
AND cmn.column_two <= 30
UNION
SELECT t3.table_id FROM TABLE_THREE t3, COMMON_TABLE cmn
WHERE
t3.table_name = 'TEST_THREE'
AND t3.table_id = cmn.common_id
AND cmn.column_one > 20
AND cmn.column_two <= 30
UNION
SELECT tc1.table_id FROM TABLE_CHILD_ONE tc1, TABLE_ONE t1, COMMON_TABLE cmn
WHERE
tc1.table_name = 'TEST_CHILD_ONE'
AND tc1.table_id = t1.table_id
AND cmn.column_one > 20
AND cmn.column_two <= 30
UNION
SELECT tc2.table_id FROM TABLE_CHILD_TWO tc2, TABLE_TWO t2, COMMON_TABLE cmn
WHERE
tc2.table_name = 'TEST_CHILD_TWO'
AND tc2.table_id = t2.table_id
AND cmn.column_one > 20
AND cmn.column_two <= 30
我想删除重复的行
AND cmn.column_one > 20
AND cmn.column_two <= 30
使用UNION并从所有表中获取值,然后与COMMON_表进行一次联接
SELECT table_id
FROM
(
SELECT t1.table_id FROM TABLE_ONE t1
WHERE t1.table_name = 'TEST_ONE'
UNION
SELECT t2.table_id FROM TABLE_TWO t2
WHERE t2.table_name = 'TEST_TWO'
UNION
SELECT tc1.table_id FROM TABLE_CHILD_ONE tc1
JOIN TABLE_ONE t1
ON tc1.table_name = 'TEST_CHILD_ONE'
AND tc1.table_id = t1.table_id
) T
JOIN COMMON_TABLE cmn
ON T.table_id = cmn.common_id
AND cmn.column_one > 20
AND cmn.column_two <= 30
使用UNION并从所有表中获取值,然后与COMMON_表进行一次联接
SELECT table_id
FROM
(
SELECT t1.table_id FROM TABLE_ONE t1
WHERE t1.table_name = 'TEST_ONE'
UNION
SELECT t2.table_id FROM TABLE_TWO t2
WHERE t2.table_name = 'TEST_TWO'
UNION
SELECT tc1.table_id FROM TABLE_CHILD_ONE tc1
JOIN TABLE_ONE t1
ON tc1.table_name = 'TEST_CHILD_ONE'
AND tc1.table_id = t1.table_id
) T
JOIN COMMON_TABLE cmn
ON T.table_id = cmn.common_id
AND cmn.column_one > 20
AND cmn.column_two <= 30
使用UNION并从所有表中获取值,然后与COMMON_表进行一次联接
SELECT table_id
FROM
(
SELECT t1.table_id FROM TABLE_ONE t1
WHERE t1.table_name = 'TEST_ONE'
UNION
SELECT t2.table_id FROM TABLE_TWO t2
WHERE t2.table_name = 'TEST_TWO'
UNION
SELECT tc1.table_id FROM TABLE_CHILD_ONE tc1
JOIN TABLE_ONE t1
ON tc1.table_name = 'TEST_CHILD_ONE'
AND tc1.table_id = t1.table_id
) T
JOIN COMMON_TABLE cmn
ON T.table_id = cmn.common_id
AND cmn.column_one > 20
AND cmn.column_two <= 30
使用UNION并从所有表中获取值,然后与COMMON_表进行一次联接
SELECT table_id
FROM
(
SELECT t1.table_id FROM TABLE_ONE t1
WHERE t1.table_name = 'TEST_ONE'
UNION
SELECT t2.table_id FROM TABLE_TWO t2
WHERE t2.table_name = 'TEST_TWO'
UNION
SELECT tc1.table_id FROM TABLE_CHILD_ONE tc1
JOIN TABLE_ONE t1
ON tc1.table_name = 'TEST_CHILD_ONE'
AND tc1.table_id = t1.table_id
) T
JOIN COMMON_TABLE cmn
ON T.table_id = cmn.common_id
AND cmn.column_one > 20
AND cmn.column_two <= 30
你试过这个吗
select table_id
from
(
select table_id, cmn.column_one, cmn.column_two
etc
) derived_table
where column_one > 20
and column_two <= 30
你试过这个吗
select table_id
from
(
select table_id, cmn.column_one, cmn.column_two
etc
) derived_table
where column_one > 20
and column_two <= 30
你试过这个吗
select table_id
from
(
select table_id, cmn.column_one, cmn.column_two
etc
) derived_table
where column_one > 20
and column_two <= 30
你试过这个吗
select table_id
from
(
select table_id, cmn.column_one, cmn.column_two
etc
) derived_table
where column_one > 20
and column_two <= 30
除非您真的需要数据整合,否则您应该使用UNIONALL,UNION确实提供了数据整合,这会降低性能
调整连接条件-不再三次,并且t3.table_id=cmn.common_id
由于数据的复杂性,只需将所有数据放到需要的地方:
SELECT table_id
FROM (
(SELECT
t1.table_id
FROM TABLE_ONE t1
WHERE t1.table_name = 'TEST_ONE'
UNION ALL
SELECT tc1.table_id
FROM TABLE_CHILD_ONE tc1
JOIN TABLE_ONE t1
ON tc1.table_id = t1.table_id
WHERE tc1.table_name = 'TEST_CHILD_ONE'
)
UNION ALL
(SELECT t2.table_id
FROM TABLE_TWO t2
WHERE t2.table_name = 'TEST_TWO'
UNION ALL
SELECT tc2.table_id
FROM TABLE_CHILD_TWO tc2
JOIN TABLE_TWO t2
ON tc2.table_id = t2.table_id
WHERE tc2.table_name = 'TEST_CHILD_TWO'
)
UNION ALL
SELECT t3.table_id
FROM TABLE_THREE t3
WHERE t3.table_name = 'TEST_THREE') T
JOIN COMMON_TABLE cmn
ON T.table_id = cmn.common_id
WHERE cmn.column_one > 20
AND cmn.column_two <= 30;
除非您真的需要数据整合,否则您应该使用UNIONALL,UNION确实提供了数据整合,这会降低性能
调整连接条件-不再三次,并且t3.table_id=cmn.common_id
由于数据的复杂性,只需将所有数据放到需要的地方:
SELECT table_id
FROM (
(SELECT
t1.table_id
FROM TABLE_ONE t1
WHERE t1.table_name = 'TEST_ONE'
UNION ALL
SELECT tc1.table_id
FROM TABLE_CHILD_ONE tc1
JOIN TABLE_ONE t1
ON tc1.table_id = t1.table_id
WHERE tc1.table_name = 'TEST_CHILD_ONE'
)
UNION ALL
(SELECT t2.table_id
FROM TABLE_TWO t2
WHERE t2.table_name = 'TEST_TWO'
UNION ALL
SELECT tc2.table_id
FROM TABLE_CHILD_TWO tc2
JOIN TABLE_TWO t2
ON tc2.table_id = t2.table_id
WHERE tc2.table_name = 'TEST_CHILD_TWO'
)
UNION ALL
SELECT t3.table_id
FROM TABLE_THREE t3
WHERE t3.table_name = 'TEST_THREE') T
JOIN COMMON_TABLE cmn
ON T.table_id = cmn.common_id
WHERE cmn.column_one > 20
AND cmn.column_two <= 30;
除非您真的需要数据整合,否则您应该使用UNIONALL,UNION确实提供了数据整合,这会降低性能
调整连接条件-不再三次,并且t3.table_id=cmn.common_id
由于数据的复杂性,只需将所有数据放到需要的地方:
SELECT table_id
FROM (
(SELECT
t1.table_id
FROM TABLE_ONE t1
WHERE t1.table_name = 'TEST_ONE'
UNION ALL
SELECT tc1.table_id
FROM TABLE_CHILD_ONE tc1
JOIN TABLE_ONE t1
ON tc1.table_id = t1.table_id
WHERE tc1.table_name = 'TEST_CHILD_ONE'
)
UNION ALL
(SELECT t2.table_id
FROM TABLE_TWO t2
WHERE t2.table_name = 'TEST_TWO'
UNION ALL
SELECT tc2.table_id
FROM TABLE_CHILD_TWO tc2
JOIN TABLE_TWO t2
ON tc2.table_id = t2.table_id
WHERE tc2.table_name = 'TEST_CHILD_TWO'
)
UNION ALL
SELECT t3.table_id
FROM TABLE_THREE t3
WHERE t3.table_name = 'TEST_THREE') T
JOIN COMMON_TABLE cmn
ON T.table_id = cmn.common_id
WHERE cmn.column_one > 20
AND cmn.column_two <= 30;
除非您真的需要数据整合,否则您应该使用UNIONALL,UNION确实提供了数据整合,这会降低性能
调整连接条件-不再三次,并且t3.table_id=cmn.common_id
由于数据的复杂性,只需将所有数据放到需要的地方:
SELECT table_id
FROM (
(SELECT
t1.table_id
FROM TABLE_ONE t1
WHERE t1.table_name = 'TEST_ONE'
UNION ALL
SELECT tc1.table_id
FROM TABLE_CHILD_ONE tc1
JOIN TABLE_ONE t1
ON tc1.table_id = t1.table_id
WHERE tc1.table_name = 'TEST_CHILD_ONE'
)
UNION ALL
(SELECT t2.table_id
FROM TABLE_TWO t2
WHERE t2.table_name = 'TEST_TWO'
UNION ALL
SELECT tc2.table_id
FROM TABLE_CHILD_TWO tc2
JOIN TABLE_TWO t2
ON tc2.table_id = t2.table_id
WHERE tc2.table_name = 'TEST_CHILD_TWO'
)
UNION ALL
SELECT t3.table_id
FROM TABLE_THREE t3
WHERE t3.table_name = 'TEST_THREE') T
JOIN COMMON_TABLE cmn
ON T.table_id = cmn.common_id
WHERE cmn.column_one > 20
AND cmn.column_two <= 30;
另外,我已经尝试过cartisian产品,嵌套选择查询。。但主要是由于性能影响,我无法使用它,因为我所有的表中都包含数百万行。您真的需要所有这些吗,其中t1.table_name='TEST_ONE'…tc1.table_name='TEST_CHILD_ONE'?如果这些确实反映了数据的子分区,是否有可能将数据拆分到更多的表上?你检查过你的索引吗?是的,这只是样本数据,但在我最初的查询中,我有许多行加上与上面类似的条件,你有三次,t3.table_id=cmn.common_id在这里。你真的也在问吗?我的错。我现在编辑了查询。我没有那样的东西。复制粘贴错误。P.S我已经尝试过cartisian产品,嵌套选择查询。。但主要是由于性能影响,我无法使用它,因为我所有的表中都包含数百万行。您真的需要所有这些吗,其中t1.table_name='TEST_ONE'…tc1.table_name='TEST_CHILD_ONE'?如果这些确实反映了数据的子分区,是否有可能将数据拆分到更多的表上?你检查过你的索引吗?是的,这只是样本数据,但在我最初的查询中,我有许多行加上与上面类似的条件,你有三次,t3.table_id=cmn.common_id在这里。你真的也在问吗?我的错。我现在编辑了查询。我没有那样的东西。复制粘贴错误。P.S我已经尝试过cartisian产品,嵌套选择查询。。但主要是由于性能影响,我无法使用它,因为我所有的表中都包含数百万行。您真的需要所有这些吗,其中t1.table_name='TEST_ONE'…tc1.table_name='TEST_CHILD_ONE'?如果这些确实反映了数据的子分区,是否有可能将数据拆分到更多的表上?你检查过你的索引吗?是的,这只是样本数据,但在我最初的查询中,我有许多行加上与上面类似的条件,你有三次,t3.table_id=cmn.common_id在这里。你真的也在问吗?我的错。我现在编辑了查询。我没有那样的东西。复制粘贴错误。P.S我已经尝试过cartisian产品,嵌套选择查询。。但主要是由于性能影响,我无法使用它,因为我所有的表中都包含数百万行。您真的需要所有这些吗,其中t1.table_name='TEST_ONE'…tc1.table_name='TEST_CHILD_ONE'?如果这些确实反映了数据的子分区,是否有可能将数据拆分到更多的表上?你检查过你的索引吗?是的,这只是样本数据,但在我最初的查询中,我有许多行加上与上面类似的条件,你有三次,t3.table_id=cmn.common_id在这里。你真的也在问吗?我的错。我现在编辑了查询。我没有那样的东西。复制粘贴错误。