使用内部联接

内部联接是使用比较运算符比较要联接列中的值的联接。

在 ISO 标准中,可以在 FROM 子句或 WHERE 子句中指定内部联接。这是 WHERE 子句中 ISO 支持的唯一一种联接类型。WHERE 子句中指定的内部联接称为旧式内部联接。

下面的 Transact-SQL 查询是一个内部联接示例:

USE AdventureWorks;
GO
SELECT *
FROM HumanResources.Employee AS e
    INNER JOIN Person.Contact AS c
    ON e.ContactID = c.ContactID
ORDER BY c.LastName

此内部联接称为同等联接。它返回两个表中的所有列,但只返回在联接列中具有相等值的行。

使用等号以外的运算符的联接

也可以联接两个不相等的列中的值。用于内部联接的运算符和谓词同样也可用于不等联接。有关可用于联接的运算符和谓词的详细信息,请参阅在表达式中使用运算符WHERE (Transact-SQL)

以下示例使用小于 (<) 联接查找产品 718 中小于所建议标价的零售价格。

USE AdventureWorks;
GO
SELECT DISTINCT p.ProductID, p.Name, p.ListPrice, sd.UnitPrice AS 'Selling Price'
FROM Sales.SalesOrderDetail AS sd
    JOIN Production.Product AS p 
    ON sd.ProductID = p.ProductID AND sd.UnitPrice < p.ListPrice
WHERE p.ProductID = 718;
GO

下面是结果集。

ProductID   Name                        ListPrice          Selling Price
----------- --------------------------- ------------------ -------------
718         HL Road Frame - Red, 44     1431.5000          758.0759
718         HL Road Frame - Red, 44     1431.5000          780.8182
718         HL Road Frame - Red, 44     1431.5000          858.90

(3 row(s) affected)

使用不等于运算符的联接

很少使用不等联接 (<>)。通常不等联接只有与自联接同时使用才有意义。例如,使用此不等 Transact-SQL 联接和自联接查找至少具有两个小于 $15 的不同价格的子类别:

USE AdventureWorks;
GO
SELECT DISTINCT p1.ProductSubcategoryID, p1.ListPrice
FROM Production.Product p1
    INNER JOIN Production.Product p2
    ON p1.ProductSubcategoryID = p2.ProductSubcategoryID
    AND p1.ListPrice <> p2.ListPrice
WHERE p1.ListPrice < $15 AND p2.ListPrice < $15
ORDER BY ProductSubcategoryID;
注意注意

表达式 NOT column_name = column_name 与表达式 column_name <> column_name 等效。

以下 Transact-SQL 示例使用不等联接与自联接查找 ProductVendor 表中的所有行,在此表中两行或多行具有相同的 ProductID 编号但具有不同的 VendorID 编号(即产品具有多个供应商):

USE AdventureWorks;
GO
SELECT DISTINCT p1.VendorID, p1.ProductID
FROM Purchasing.ProductVendor p1
    INNER JOIN Purchasing.ProductVendor p2
    ON p1.ProductID = p2.ProductID
WHERE p1.VendorID <> p2.VendorID
ORDER BY p1.VendorID