加入1 = 1与交叉加入

时间:2014-01-09 19:51:51

标签: sql join

我正在将postgresql中的一个大表连接到一个包含1行的表中。是的,我知道我可以从这个单行表中获取值并将它们写入我的查询中,但是有210列。

所以我的问题是这样的:我应该使用交叉连接或在重言式上使用常规连接(1 = 1或其他)将单行表连接到所有内容。这些方式中的任何一种都会变慢吗?

还是有第三种更快的方法吗?

4 个答案:

答案 0 :(得分:4)

需要注意的一点是,如果其中一个表为空,则交叉连接将导致空表。如果您的某个表可能为空并且您仍然需要记录,则可能需要1 = 1的外部联接(例如,左,右或完整)。

答案 1 :(得分:3)

1=1存在的原因是通过将字符串连接在一起(通常使用参数化等常用安全措施)来创建动态sql语句更容易。

在其中包含预定义的带有1=1的WHERE子句允许将其他WHERE条件添加到SQL中,而无需先检查是否存在WHERE子句,并且SQL引擎通常会优化超出1=1所以没有性能差异。

在任何其他情况下,1=1通常无害,但不是特别有用。

答案 2 :(得分:0)

它们应该执行和表现相同-不同之处在于开发人员的语义

这是一个示例演示:

-- 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

在这种情况下,对于从多个不相关的表中构建单个select语句的意图,您应该希望CROSS JOIN尽可能明确

注意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

答案 3 :(得分:-1)

仅基于我在编写大量sql后的经验。 inner join on 1=1 比简单的 cross join 快得多。