Подтвердить что ты не робот

Правильный способ выбора из двух таблиц в SQL Server без общего поля для присоединения к

В прежние времена я использовал для написания таких утверждений типа:

SELECT 
table1.columnA, table2.columnA

FROM
table1, table2

WHERE
table1.columnA = 'Some value'

Однако мне сказали, что с именами таблиц, разделенных запятыми в предложении FROM, не совместимо с ANSI92. Всегда должен быть оператор JOIN.

Это приводит к моей проблеме.... Я хочу сделать сравнение данных между двумя таблицами, но в обеих таблицах нет общего поля для создания соединения. Если я использую метод "legacy" для разделенных запятыми имен таблиц в предложении FROM (см. Пример кода), то он работает отлично. Я чувствую себя некомфортно, используя этот метод, если это считается неправильной или плохой практикой.

Кто-нибудь знает, что делать в этой ситуации?

Дополнительная информация:

Таблица 1 содержит список местоположений в типе данных географии Таблица 2 содержит другой список мест географии

Я пишу инструкцию select для сравнения расстояний между местоположениями. Насколько я знаю, вы не можете сделать JOIN в колонке географии?

4b9b3361

Ответ 1

Вы можете (должны) использовать CROSS JOIN. Следующий запрос будет эквивалентен вашему:

SELECT 
   table1.columnA
 , table2.columnA
FROM table1 
CROSS JOIN table2
WHERE table1.columnA = 'Some value'

или вы даже можете использовать INNER JOIN с некоторым всегда истинным условием:

FROM table1 
INNER JOIN table2 ON 1=1

Ответ 2

предложение - при использовании перекрестного соединения, пожалуйста, позаботьтесь о повторяющихся сценариях. Например, в вашем случае:

1) таблица 1 может содержать > 1 столбцы как часть первичных ключей (скажем, table1_id, id2, id3, table2_id) 2) таблица 2 может иметь > 1 столбцы как часть первичных ключей (скажем, table2_id, id3, id4)

поскольку между этими двумя таблицами существуют общие ключи (т.е. внешние ключи в одном/другом) - мы получим дублирующие результаты. поэтому полезно использовать следующую форму:

WITH data_mined_table (col1, col2, col3, etc....) AS
SELECT DISTINCT col1, col2, col3, blabla
FROM table_1 (NOLOCK), table_2(NOLOCK))
SELECT * from data_mined WHERE data_mined_table.col1 = :my_param_value

Ответ 3

Кросс-соединение поможет объединить несколько таблиц без общих полей. Но будьте осторожны, присоединяясь, так как это соединение даст декартовую таблицу результатов из двух таблиц. QUERY:

SELECT 
   table1.columnA
 , table2,columnA
FROM table1 
CROSS JOIN table2

Альтернативный способ присоединиться к некоторому условию, которое всегда истинно как

SELECT 
   table1.columnA
 , table2,columnA
FROM table1 
INNER JOIN table2 ON 1=1

Но этого типа запросов следует избегать как для производительности, так и для стандартов кодирования.