SQL - Какой тип соединения это и лучший способ переписать? - PullRequest
1 голос
/ 02 октября 2009

Наше стороннее приложение имеет пользовательский вид со следующим:

FROM dbo.vwPositionAssetSubWeight 
INNER JOIN dbo.vwPositionAssetSubTotal 
    ON dbo.vwPositionAssetSubWeight.AssetID = dbo.vwPositionAssetSubTotal.AssetID 
FULL OUTER JOIN dbo.vwPositionAssetPendingTrades 
    ON dbo.vwPositionAssetSubWeight.AssetID = dbo.vwPositionAssetPendingTrades.AssetID
, dbo.vwPositionPortfoliosTotal

Примечание. Пункт "Там" отсутствует.

Часть этого беспорядка имеет смысл, но я не знаком с тем, как последний вид соединен или, возможно, не соединен. Является ли dbo.vwPositionPortfoliosTotal перекрестным соединением для всего? Это мое предположение. Кроме того, dbo.vwPositionPortfoliosTotal возвращает одну строку.

Каков наилучший способ переписать это, так что имеет смысл для следующего разработчика?

О, никаких псевдонимов, 111 возвращенных полей, нет документации, замечаний, подсказок или даже следа от сухарей.

Ответы [ 5 ]

2 голосов
/ 02 октября 2009

Эти два утверждения эквивалентны.

SELECT *
FROM a, b

SELECT *
FROM a CROSS JOIN b

Изучите ваше условие where ... в нем могут скрываться критерии объединения, которые заставят вас выбирать внутренние / внешние объединения.

2 голосов
/ 02 октября 2009

Да, последняя часть ', dbo.vwPositionPortfoliosTotal' является перекрестным соединением всего, что находится перед запятой и dbo.vwPositionPortfoliosTotal, но это также зависит от части WHERE.

Чтобы увидеть, можете ли вы переписать это перекрестное объединение (например, удалите его), вы должны показать, какие поля выбраны из vwPositionPortfoliosTotal и какие условия используются.

2 голосов
/ 02 октября 2009

Критерии соединения dbo.vwPositionPortfoliosTotal будут найдены в предложении WHERE, поэтому, чтобы узнать, что он делает, вам нужно будет опубликовать эту часть. Ищите, где написано что-то вроде dbo.vwPositionPortfoliosTotal.[column] = dbo.[table].[column]

Edit:

Как говорится в принятом ответе, без ГДЕ это КРЕСТНОЕ СОЕДИНЕНИЕ.

2 голосов
/ 02 октября 2009

Это действительно перекрестное соединение. Если вы действительно хотите прояснить ситуацию, просто замените запятую на «CROSS JOIN».

0 голосов
/ 02 октября 2009

Использование запятой в предложении FROM оператора SELECT аналогично декартовому произведению (перекрестное соединение).

Например,

SELECT *
FROM a, b

будет сопоставлять каждую запись с a с каждой записью с b. Это эквивалентно

SELECT *
FROM a
CROSS JOIN b
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...