Перевод выражения QueryExpression на SQL: что такое естественное соединение? - PullRequest
0 голосов
/ 27 сентября 2011

Я пытаюсь перевести выражение QueryExpression, содержащееся в некотором существующем коде, в оператор выбора T-SQL.

Я столкнулся со следующим утверждением, и у меня возникли проблемы с пониманием того, что они подразумевают подNatural Join:

linkEntity1.JoinOperator = JoinOperator.Natural;

Было бы это эквивалентно Внутреннему объединению в T-SQL?Поиск в Google не сильно помог.

Вот остальная часть кода выражения QueryExpression:

QueryExpression query = new QueryExpression();

query.EntityName = "showinfo";

ColumnSet columns = new ColumnSet();
columns.Attributes = new String[] { "company" };
query.ColumnSet = columns;

query.Criteria = new FilterExpression();
query.Criteria.FilterOperator = LogicalOperator.And;

ConditionExpression condition1 = new ConditionExpression();
condition1.AttributeName = "company";
condition1.Operator = ConditionOperator.NotNull;
query.Criteria.Conditions = new ConditionExpression[] { condition1 };

LinkEntity linkEntity1 = new LinkEntity();
linkEntity1.JoinOperator = JoinOperator.Natural;
linkEntity1.LinkFromEntityName = "show";
linkEntity1.LinkFromAttributeName = "showid";
linkEntity1.LinkToEntityName = "showintegration";
linkEntity1.LinkToAttributeName = "showcode";

linkEntity1.LinkCriteria = new FilterExpression();
linkEntity1.LinkCriteria.FilterOperator = LogicalOperator.And;

ConditionExpression condition2 = new ConditionExpression();
condition2.AttributeName = "showend";
condition2.Operator = ConditionOperator.Null;

linkEntity1.LinkCriteria.Conditions = new ConditionExpression[] { condition2 };
query.LinkEntities = new LinkEntity[] { linkEntity1 };

Ответы [ 3 ]

3 голосов
/ 27 сентября 2011

В SQL Server нет эквивалента естественного объединения, в котором пересечение таблиц основано на именах столбцов СУБД.

Я рад этому, потому что в лучшем случае это неоднозначно, а в худшем - опасно.СОЕДИНЕНИЯ должны быть явными.Примеры почему:

  • со столбцом InsertedBy в обеих таблицах (довольно часто): нужно ли добавлять префикс к имени таблицы, чтобы удалить неоднозначность?
  • будущий DDL, который добавляет столбцы, которые изменяютсяСемантика JOIN

См.

Edit:

Похоже, что естественное соединение означает «не повторять столбец в выводе» (как USING в MySQL сделает) в соответствии с JoinOperator перечисления .

1028 * Если я это понимаю (спорно!), это вводит в заблуждение.Особенно, когда я читаю рассказ "LeftOuter" ..
1 голос
/ 27 сентября 2011

При естественном объединении сравниваются все столбцы в двух таблицах с одинаковыми именами столбцов.Это эквивалентно внутреннему объединению с явно указанными соответствующими столбцами.

0 голосов
/ 27 сентября 2011

Да - естественное соединение - это внутреннее соединение, поэтому вы можете написать:

select * from tab1, tab2 where tab1.col1 = tab2.col1

в

select * from tab1 inner join tab2 on tab1.col1 = tab2.col1
...