2017-10-04 22 views
-1

说我有这个列表理解Python中请问这个Python列表读取一个SQL查询语句

[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) 

它是正确的吗?可以改进吗?它有效吗?

+0

效率取决于执行的细节,如索引,通常只能用于某些类型的条件(列之间的比较,而不是函数调用) – Barmar

+1

提供了一个现实的数据样本,预期结果 – scaisEdge

+0

'(x,y)'意味着每个原始数据中只有一列table,'Xx'和'Yy'。这与你的SQL查询有什么关系,它在每个表中列出几列?什么是“坏”列? – Barmar

回答

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 ON vs WHERE clause交叉产品上的INNER JOIN

如果条件是实际的函数调用,这很可能是非常低效的,因为它无法使用索引。 DBMS必须生成完整的交叉产品,然后调用所有列的函数以确定它是否应包含在结果集中,因此它将为O(m * n),其中mn是表中的行数。但是如果它像X.colA = Y.colB那样简单,那么可以使用这些列上的索引来优化查询。

索引通常可以用来优化平等和不平等的比较(如col1 < col2),以及串前缀(col1 LIKE 'foo%'),你还可以创建全文搜索和地理坐标专门的索引。

+1

你在问题中的回答是很好的,只要'f'被定义为使得'f(X,Y)=(do_something(X,Y),do_something_else(X,Y))'和'g'被定义为“g” (X,Y)=条件(X,Y)AND another_condition(X,Y)'。 Barmar的答案是相同的,只是它没有对'f'和'g'的形式施加任何限制,所以更直接的翻译了你的数学符号和你的Python列表理解。 – Patrick87

+0

@barmar谢谢你,你的代码比我的更受欢迎吗?在我诚实的意见(我刚刚开始使用SQL)我的代码更具可读性 – Elmex80s

+1

这只是更现代的语法。 'JOIN'和'ON'可以让你清楚地知道使用哪些条件来关联表格,而不是更一般地适用的条件。当你加入多个表格时,它特别有用,你可以清楚地看到关系。 – Barmar