它们应该执行和表现相同 - 区别在于开发人员语义
这是一个示例演示:
-- Setup
DECLARE @Codeset TABLE (id INT, [name] VARCHAR(50));
DECLARE @Student TABLE (id INT, [name] VARCHAR(50), age INT);
INSERT INTO @Codeset
VALUES (1, 'HomeRoom');
INSERT INTO @Student
VALUES (1, 'Jolly', 20),
(2, 'Sally', 22);
假设我们想要从@Student 取回每一行,并从@Codeset 取回名称值:
| id | name | age | name |
|----|-------|-----|----------|
| 1 | Jolly | 20 | HomeRoom |
| 2 | Sally | 22 | HomeRoom |
当任一表有 0、1 或 1+ 条记录时,以下任何语法都可以完成此操作:
-- INNER JOIN 1=1
SELECT s.id, s.[name], s.age, c.[name]
FROM @Student s
INNER JOIN @Codeset c ON 1=1
-- Multiple From tables
SELECT s.id, s.[name], s.age, c.[name]
FROM @Student s,
@Codeset c
-- CROSS JOIN
SELECT s.id, s.[name], s.age, c.[name]
FROM @Student s
CROSS JOIN @Codeset c
在这种情况下,您应该更喜欢 CROSS JOIN 尽可能明确地表明您从多个不相关的表中构建单个 select 语句的意图
注意:CROSS JOIN 的输出与INNER JOIN ON 1=1 相同。两者都产生两个行集中所有行的笛卡尔积,所以如果一个表是空的,结果也是如此。
如果@Students有记录时需要保证结果,但@Codeset可能为空,则需要使用LEFT JOIN ON 1=1
另见:Correct way to select from two tables in SQL Server with no common field to join on