如何删除笛卡尔联接

问题描述 投票:0回答:1

我有两个表,它们的结构类似于下面的两个表。名称:

ID     | FirstName | LastName
__________________________
123     Akshay     kumar
123     Salman     khan
123     Johnny      lever
123     Tom           Cruise

城市:

ID     | City
___________
123     Pune

现在,当我运行以下查询时:

Select N.*,C.* from Name N,City C where C.ID=N.ID and N.ID=123; 

ID     | FirstName | LastName | ID     | City 
_____________________________________________
123     Akshay     kumar             123     Pune
123     Salman     khan               123     Pune
123     Johnny      lever               123     Pune
123     Tom           Cruise            123     Pune

浦那正在重复4次。而我要输出如下:

ID     | FirstName | LastName | ID     | City 
_____________________________________________
123     Akshay     kumar             123     Pune
123     Salman     khan               
123     Johnny      lever               
123     Tom           Cruise   

名称和城市表数据之间没有任何关系,除了ID Coumn。同样,对于相同的ID,名称表的条目比城市表的条目多是强制性的。对于相同的ID,“城市表”中的行也可以比“名称表”中的行多(因此,左联接将不起作用)请帮助伙计们。

mysql oracle oracle11g oracle10g cartesian-product
1个回答
0
投票

[这是一个要求,通常会在您的表示层中处理,例如PHP,或使用数据库的任何工具。话虽如此,我们实际上可以使用ROW_NUMBER处理您的要求:

WITH cte AS (
    SELECT n.FirstName, n.LastName, c.ID, c.City,
        ROW_NUMBER() OVER (PARTITION BY c.ID, c.City ORDER BY n.LastName, n.FirstName) rn
    FROM Name n
    INNER JOIN City c ON c.ID = n.ID
    WHERE n.ID = 123
)

SELECT ID, FirstName, LastName,
    CASE WHEN rn = 1 THEN ID END AS ID,
    CASE WHEN rn = 1 THEN City END AS City
FROM cte
ORDER BY
    ID,
    LastName,
    FirstName;
© www.soinside.com 2019 - 2024. All rights reserved.