我在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
关于如何实现这一目标的任何想法?
答案 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