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 查询:(
最佳答案
如果您在 SQL 语句中多次列出同一个表,并且不提供 JOIN 这些表的条件,那么您将在结果集中创建笛卡尔 JOIN,这将是巨大的:
SELECT * FROM MyTable A, MyTable B;
如果MyTable有1000条记录,将创建一个有100万条记录的结果集。您包含的任何其他选择标准都必须在所有 100 万条记录中进行评估。
我不确定这就是您正在做的事情(您的问题非常不清楚),但这可能是解决您的问题的开始。
现在更新了答案,发帖者已添加正在执行的查询。
您必须采取一些技巧才能获得您想要的结果。您需要使用 CASE 和 MAX,不幸的是,CASE 的语法有点冗长:
SELECT MAX(CASE WHEN name='a' THEN value ELSE NULL END),
MAX(CASE WHEN name='b' THEN value ELSE NULL END),
MAX(CASE WHEN name='c' THEN value ELSE NULL END),
MAX(CASE WHEN name='d' THEN value ELSE NULL END)
FROM MainTable WHERE name IN ('a','b','c','d');
请在您的实际数据库中尝试一下,看看您会得到什么(当然,您要确保列名已建立索引)。
关于SQLite 表别名影响查询性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7367548/