将QueryExpression转换为SQL:什么是自然连接?

时间:2011-09-27 16:26:05

标签: sql-server tsql dynamics-crm-4

我正在尝试将某些现有代码中的QueryExpression转换为T-SQL select语句。

我遇到以下陈述,我无法理解自然加入的含义:

linkEntity1.JoinOperator = JoinOperator.Natural;

这是否等同于T-SQL中的内部联接?谷歌搜索没有多大帮助。

以下是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 个答案:

答案 0 :(得分:3)

在SQL Server中没有自然连接的等价物,其中表相交是基于RDBMS的列名。

我很高兴,因为它充其量是暧昧的,最坏的是危险的。 JOIN应该是明确的。示例原因:

  • 在两个表中都有一个InsertedBy列(很常见):我们是否应该使用表名前缀来消除歧义?
  • 添加更改JOIN语义的列的未来DDL

编辑:

根据JoinOperator Enumeration,看起来自然连接意味着“不要在输出中重复列”(就像在MySQL中的USING一样)。

如果我理解这一点(有争议的话),这会产生误导。特别是当我读到“LeftOuter”叙事时......

答案 1 :(得分:1)

自然连接会比较两个具有相同列名的表中的所有列。它等同于内部联接,其中明确列出了匹配列。

答案 2 :(得分:0)

是 - 自然联接是内连接 - 所以你可以写:

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

作为

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