2015-08-19 2 views
3

У меня есть две таблицы в SQL БД с именем tbl_country и tbl_seaportSQL дизайн запрос не возвращает ожидаемые результаты

Я пытаюсь создать запрос, который возвращает все возможные комбинации двух таблиц с использованием объединения на поле 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

Если вы хотите достичь всей комбинации, вам не следует использовать соединение. – Urvi

+0

Что именно вы хотите достичь? Получите все комбинации стран страны, включая присоединение каждой страны к себе, а затем? Как порты будут задействованы в запросе? Также получите все портовые комбинации? Или только один порт на страну? Или что еще? –

+0

Спасибо за ответ. Я хотел бы создать запрос и составить таблицу с этим запросом, которая объединяет все комбинации стран и портов, но НЕ включает то, что вы описали «страна для себя». – d1g1tr0n

ответ

5

Попробуйте

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

EDIT: касаемо свой комментарий, вы можете использовать ниже запрос, чтобы присоединиться к 3-й table.make уверен, чтобы удалить любые имена столбцов дублирования.

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 

но, пожалуйста, пересмотреть свой дизайн

+0

Это лучше спасибо. Интересно, как sql может идентифицировать соединение или автоматически идентифицировать первичный ключ? – d1g1tr0n

+0

Любая идея, как я могу добавить вторую таблицу в это тоже? Поля: PortID, PortName, RoutingCod e, CountryCode. – d1g1tr0n

+0

@ d1g1tr0n: обновленный ответ. – DarkKnight

-2

Пожалуйста, попробуйте следующий запрос

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

Предложите синтаксис pre-ansi-92. «CROSS JOIN» был правильным синтаксисом более 20 лет. – MatBailie

+0

В соответствии с моим пониманием перекрестное соединение будет делать то же самое. – Urvi

+0

Да. Но синтаксис, который вы выбрали, устарел, даже Oracle. Его больше нельзя использовать. Поскольку правильная и поддерживаемая альтернатива существует уже более 20 лет, я проголосовал за использование устаревшего, устаревшего, не поддерживаемого синтаксиса. – MatBailie

1

Как уже упоминалось это перекрестное соединение, которая соединяет две таблицы, безусловно, таких, как построить декартово произведение из таблиц.

Однако, теперь, когда вы уточнили свой запрос, становится ясно, что вам нужно условие. Только условие - это не какой-то столбец, который должен совпадать с другим, как это обычно бывает при объединении таблиц, но наоборот: запись должна не.

Тогда это фактически все морской порт комбинации, которые вы ищете. Страны морских портов неявные, т. Е. Морской порт принадлежит стране, поэтому вы можете использовать обычное соединение для его получения.

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.

+0

@ Thorsten Kettner - спасибо кучи за дополнительное решение моего вопроса. Хотя Dark Knight уже предоставил решение, которое я использовал и модифицировал, чтобы получить окончательный результат. Я хотел бы добавить ваше решение в качестве возможного ответа на мою проблему. Еще раз спасибо. – d1g1tr0n

Смежные вопросы