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

SQL查询设计未返回预期结果,sql,sql-server,tsql,Sql,Sql Server,Tsql,我在一个名为tbl_country和tbl_seaport的SQL数据库中有两个表 我正在尝试创建一个查询,该查询使用字段CountryCode上的联接返回两个表的所有可能组合。 tbl_country Fields: CountryID, Country, CountryCode tbl_seaport Fields: PortID, PortName, RoutingCode, CountryCode 我从下面开始,但我只能让它返回250行,这是实际的表行数。我认为它将返回6250

我在一个名为tbl_country和tbl_seaport的SQL数据库中有两个表

我正在尝试创建一个查询,该查询使用字段
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
关于如何实现这一点有什么想法吗?

试试这个

SELECT s.Country, m.Country FROM tbl_country AS s cross JOIN tbl_country AS m 
编辑: 关于您的评论,您可以使用下面的查询加入第三个表。请确保删除任何重复的列名

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

但是,请重新考虑您的设计

请尝试以下查询

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

如前所述,它是一种无条件连接两个表的交叉连接,例如构建表的笛卡尔乘积

然而,现在您澄清了您的请求,很明显您确实想要一个条件。唯一的条件是,某些列必须与另一列匹配,这通常是在连接表时出现的情况,但情况正好相反:记录不能与自身匹配

那么实际上你所寻求的是所有海港组合。海港的国家是隐式的,即海港属于一个国家,因此可以使用普通联接来获取它

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;
选择
port1.portname作为port1\u名称,
国家1.作为港口国的国家,
port2.portname作为port2\u名称,
国家2.作为港口2_国家的国家
从tbl_海港1港出发
在port2.portid port1.portid上加入tbl_海港port2
在country1.countryid=port1.countryid上加入tbl_country1
在country2.countryid=port2.countryid上加入tbl_country2;

上面仍然提供了两种组合,例如PORT_A-PORT_B和PORT_B-PORT_A。如果要省略此项,请将ON子句更改为
port2.portid>port1.portid

如果要实现所有组合,则不应使用join。您到底想要实现什么?获取所有国家/地区组合,包括将每个国家加入自己的国家,然后?港口应如何参与查询?还获得所有端口组合?还是每个国家只有一个港口?还是别的?谢谢你的回复。我想创建一个查询并用该查询生成一个表,该查询将所有国家和海港组合组合在一起,但不包括您所描述的“国家对其自身”。因此,我将所有港口与所有港口组合在一起,包括每个港口与其自身,对吗?然后加入港口国。还是我误解了你?@d1g1tr0n-我刚刚注意到,你加入了
tbl_country
tbl_country
,但在之前的帖子中,你说你想要
两个表的所有可能组合。您是否错误地认为要联接的表之一应该是
tbl_海港
?然后你会把每个国家的每个海港都列出来?也许给出简化的示例表内容和期望的结果会有所帮助?建议使用ansi-92之前的语法<代码>交叉连接
是20多年来正确的语法。据我所知,交叉连接也会做同样的事情。是的。但您选择使用的语法已被弃用,甚至Oracle也不推荐使用。它不应该再被使用。由于正确且受支持的替代方案已经存在了20多年,我已经否决了您对遗留的、不推荐的、不受支持的语法的使用。谢谢。我想知道sql是如何识别连接的,还是它会自动识别主键?知道如何将第二个表添加到其中吗?字段:PortID、PortName、RoutingCode、CountryCode.Msg 8156,级别16,状态1,第1行为“cte”多次指定了列“Country”。现在可以了,我只需要找出如何省略相同的国家/地区组合。例如,我有安道尔到安道尔等…@d1g1tr0n我认为它真的不需要识别PK。它只是从表1中获取所有行,并为每一行分配表2中的一行。它只需要知道@Thorsten Kettner需要xJoin的两个表——感谢heaps为我的问题提供了额外的解决方案。虽然黑暗骑士已经提供了一个解决方案,我使用和修改,以获得我的最终结果。我想添加您的解决方案,作为我问题的可能答案。再次感谢。