我正在将postgresql中的一个大表连接到一个包含1行的表中。是的,我知道我可以从这个单行表中获取值并将它们写入我的查询中,但是有210列。
所以我的问题是这样的:我应该使用交叉连接或在重言式上使用常规连接(1 = 1或其他)将单行表连接到所有内容。这些方式中的任何一种都会变慢吗?
还是有第三种更快的方法吗?
答案 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
快得多。