Sql 如何比较表、查找重复项以及查找具有不同值的列
我在Oracle 10g中有以下表格:Sql 如何比较表、查找重复项以及查找具有不同值的列,sql,plsql,oracle10g,Sql,Plsql,Oracle10g,我在Oracle 10g中有以下表格: Table1 Name Status a closed b live c live Table2 Name Status a final b live c live 两个表中都没有主键,我正在尝试编写一个查询,该查询将返回相同的行,而不会循环两个表并比较行/列。如果status列不同,则表2中的行将显示 因此,在上面的示例中,我的查询应返回以下内容: N
Table1
Name Status
a closed
b live
c live
Table2
Name Status
a final
b live
c live
两个表中都没有主键,我正在尝试编写一个查询,该查询将返回相同的行,而不会循环两个表并比较行/列。如果status列不同,则表2中的行将显示
因此,在上面的示例中,我的查询应返回以下内容:
Name Status
a final
b live
c live
既然您提到两个表上都没有主键,我假设可能有一行存在于
Table1
、Table2
,或者两者都存在。下面的查询使用公共表表达式
和窗口函数
得到这样的结果
WITH unionTable
AS
(
SELECT Name, Status, 1 AS ordr FROM Table1
UNION
SELECT Name, Status, 2 AS ordr FROM Table2
),
ranks
AS
(
SELECT Name, Status,
ROW_NUMBER() OVER (PARTITION BY NAME ORDER BY ordr DESC) rn
FROM unionTable
)
SELECT Name, Status
FROM ranks
WHERE rn = 1
- 既然您提到两个表上都没有主键,我假设可能有一行存在于
表1
、表2
,或者两者都存在。下面的查询使用公共表表达式
和窗口函数
得到这样的结果
WITH unionTable
AS
(
SELECT Name, Status, 1 AS ordr FROM Table1
UNION
SELECT Name, Status, 2 AS ordr FROM Table2
),
ranks
AS
(
SELECT Name, Status,
ROW_NUMBER() OVER (PARTITION BY NAME ORDER BY ordr DESC) rn
FROM unionTable
)
SELECT Name, Status
FROM ranks
WHERE rn = 1
- 像这样的东西
SELECT table1.Name, table2.Status
FROM table1
INNER JOIN table2 ON table1.Name = table2.Name
通过始终返回table2.Status
,您已经涵盖了相同和不同的情况(本质上,表1.Status的值是什么并不重要)。类似的情况
SELECT table1.Name, table2.Status
FROM table1
INNER JOIN table2 ON table1.Name = table2.Name
通过始终返回table2.Status
,您已经涵盖了它们相同和不同的情况(本质上,表1.Status的值是什么并不重要)