问题描述
假设您有表dbo.Customers有一百万行
SELECT * from dbo.Customers A
不会导致创建表的副本。
正如拉里(Larry)所指出的那样,查询本身对表进行四次笛卡尔乘积运算,正如您所观察到的那样,这会降低性能。
更新的票证指出,希望在同一行中具有来自不同查询的4个值。假设此语法对sqllite有效,这很简单
您可以看到以下四个查询在串行运行时产生期望的值,但在4行中。
SELECT t1.name
FROM MainTable t1
WHERE t1.name='a';
SELECT t2.name
FROM MainTable t2
WHERE t2.name='b';
SELECT t3.name
FROM MainTable t3
WHERE t3.name='c';
SELECT t4.name
FROM MainTable t4
WHERE t4.name='d';
技巧是像子查询那样简单地运行它们,因此有5个查询:1个驱动程序查询,4个子查询完成所有工作。 仅 当返回一行时,此模式 才 有效。
SELECT
(
SELECT t1.name
FROM MainTable t1
WHERE t1.name='a'
) AS t1_name
,
(
SELECT t2.name
FROM MainTable t2
WHERE t2.name='b'
) AS t2_name
,
(
SELECT t3.name
FROM MainTable t3
WHERE t3.name='c'
) AS t3_name
,
(
SELECT t4.name
FROM MainTable t4
WHERE t4.name='d'
) AS t4_name
解决方法
SQLite如何在内部处理别名?
创建表名别名是在内部创建同一表的副本还是仅引用同一表而不创建副本?
当我在代码中创建同一表的多个别名时,查询性能会受到严重影响!
在我的情况下,我有一个表,将其称为MainTable,即2列,即名称和值。我想在一行中选择多个值作为不同的列。例如
名称:a,b,c,d,e,f
值:p,q,r,s,t,u
,使得a对应于p,依此类推。
我想在一行中选择名称a,b,c和d的值=> p,q,r,s所以我写了一个查询
SELECT t1.name,t2.name,t3.name,t4.name
FROM MainTable t1,MainTable t2,MainTable t3,MainTable t4
WHERE t1.name = 'a' and t2.name = 'b' and t3.name = 'c' and t4.name = 'd';
这样,当表的大小如Larry所正确指出的那样增加时,编写查询会破坏性能。
是否有任何有效的方法来检索此结果。我对SQL查询不好:(