Правильный способ выбора из двух таблиц в SQL Server без общего поля для присоединения к
В прежние времена я использовал для написания таких утверждений типа:
SELECT
table1.columnA, table2.columnA
FROM
table1, table2
WHERE
table1.columnA = 'Some value'
Однако мне сказали, что с именами таблиц, разделенных запятыми в предложении FROM, не совместимо с ANSI92. Всегда должен быть оператор JOIN.
Это приводит к моей проблеме.... Я хочу сделать сравнение данных между двумя таблицами, но в обеих таблицах нет общего поля для создания соединения. Если я использую метод "legacy" для разделенных запятыми имен таблиц в предложении FROM (см. Пример кода), то он работает отлично. Я чувствую себя некомфортно, используя этот метод, если это считается неправильной или плохой практикой.
Кто-нибудь знает, что делать в этой ситуации?
Дополнительная информация:
Таблица 1 содержит список местоположений в типе данных географии
Таблица 2 содержит другой список мест географии
Я пишу инструкцию select для сравнения расстояний между местоположениями. Насколько я знаю, вы не можете сделать JOIN в колонке географии?
Ответы
Ответ 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
Но этого типа запросов следует избегать как для производительности, так и для стандартов кодирования.