说我在Python中有这个列表理解
[f(x, y) for (x, y) in itertools.product(X, Y) if g(x, y)]
其中X
和Y
是列表,f
和g
是作用于列表成员的函数。它如何转换为SQL查询?这是我的解决方案:
SELECT
do_something(X.column, Y.another_column, X.our_column),
do_something_else(Y.that_column, X.that_column, Y.my_column)
FROM
this_scheme.your_table as X,
that_scheme.our_table as Y
WHERE
condition(X.column, Y.my_column) AND
another_condition(Y.another_column, X.our_column)
这是对的吗?可以改进吗?它有效吗?
答案 0 :(得分:1)
您的代码是正确的,尽管在现代SQL中我们更喜欢使用显式JOIN
子句而不是交叉产品,因此最好将其编写为:
SELECT
do_something(X.column, Y.another_column, X.our_column),
do_something_else(Y.that_column, X.that_column, Y.my_column)
FROM this_scheme.your_table as X,
INNER JOIN that_scheme.our_table as Y
ON condition(X.column, Y.my_column) AND
another_condition(Y.another_column, X.our_column)
有关INNER JOIN
优于跨产品的优点的讨论,请参阅INNER JOIN ON vs WHERE clause。
如果条件是实际函数调用,则很可能效率非常低,因为它无法使用索引。 DBMS必须生成完整的交叉产品,然后调用所有列上的函数以确定它是否应包含在结果集中,因此它将是O(m * n)
,其中m
和{{ 1}}是表中的行数。但如果它像n
那样简单,那么可以使用这些列上的索引来优化查询。
索引通常可用于优化相等和不等式比较(例如X.colA = Y.colB
)和字符串前缀(col1 < col2
。您还可以为全文搜索和地理坐标创建专用索引。