我在Oracle 10g中有以下表格:
Table1
Name Status
a closed
b live
c live
Table2
Name Status
a final
b live
c live
两个表中都没有主键,我正在尝试编写一个返回相同行的查询,而不会循环两个表并比较行/列。如果状态列不同,那么表2中的行将占用优先级。
所以在上面的例子中我的查询应该返回:
Name Status
a final
b live
c live
答案 0 :(得分:3)
由于您已经提到两个表上都没有主键,我假设Table1
可能存在行,Table2
, 或两者。以下查询使用Common Table Expression
和Windowing function
来获得此类结果。
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 :(得分:1)
这样的东西?
SELECT table1.Name, table2.Status
FROM table1
INNER JOIN table2 ON table1.Name = table2.Name
通过始终返回table2.Status
,您已经涵盖了它们相同且不同时的情况(基本上与table1.Status
的值无关)。< / p>