SQL查询设计未返回预期结果

时间:2015-08-19 09:42:13

标签: sql sql-server tsql

我在SQL db中有两个表名为tbl_country和tbl_seaport

我正在尝试创建一个查询,该查询使用字段CountryCode.上的联接返回两个表的所有可能组合

tbl_country

Fields: CountryID, Country, CountryCode


tbl_seaport

Fields: PortID, PortName, RoutingCode, CountryCode

我从下面开始,但我只能让它返回250行,这是实际的表行数。我以为它会返回62500(250 x 250)行数据。

SELECT s.Country, m.Country 
FROM tbl_country AS s
LEFT JOIN tbl_country AS m
ON s.CountryID = m.CountryID

关于如何实现这一目标的任何想法?

3 个答案:

答案 0 :(得分:5)

试试这个

with cte
as
(
    SELECT s.Country as sCountry , m.Country as mCountry FROM tbl_country AS s cross JOIN tbl_country AS m
)

select * from cte cross join tbl_seaport

修改 关于您的评论,您可以使用以下查询加入第3表。确保删除任何重复列名称。

{{1}}

但请重新考虑您的设计

答案 1 :(得分:1)

如前所述,它是一个无条件连接两个表的CROSS JOIN,例如构建表的笛卡尔积。

但是,既然您已经澄清了您的请求,那么很明显您确实需要一个条件。只有条件不是某些列必须匹配另一个列,因为通常是连接表时的情况,但相反:记录必须匹配自己。

然后它实际上是您寻找的所有海港组合。海港的国家是隐含的,即海港属于一个国家,所以你可以使用普通的连接来获得它。

select 
  port1.portname as port1_name,
  country1.country as port1_country,
  port2.portname as port2_name,
  country2.country as port2_country  
from tbl_seaport port1
join tbl_seaport port2 on port2.portid <> port1.portid
join tbl_country country1 on country1.countryid = port1.countryid
join tbl_country country2 on country2.countryid = port2.countryid;

以上仍然会给你两次组合,例如: PORT_A-PORT_B和PORT_B-PORT_A。如果要省略此项,请将ON子句更改为port2.portid > port1.portid

答案 2 :(得分:-2)

请尝试以下查询

SELECT s.Country, m.Country FROM tbl_country AS s, tbl_country AS m