这个Python列表如何作为SQL查询读取

时间:2017-10-04 18:38:39

标签: python mysql sql

说我在Python中有这个列表理解

[f(x, y) for (x, y) in itertools.product(X, Y) if g(x, y)]

其中XY是列表,fg是作用于列表成员的函数。它如何转换为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) 

这是对的吗?可以改进吗?它有效吗?

1 个答案:

答案 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。您还可以为全文搜索和地理坐标创建专用索引。