2017-10-04 56 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