Join

單個 SQL 命令中的多個聯接

  • December 3, 2021

我正在使用 R 程式語言。如果滿足條件 1 或條件 2,我將嘗試執行 INNER JOIN:

條件_1

如果表_1 $ id = table_2 $ 身份證和

如果表_1 $ date BETWEEN(table_2 $ date_2,table_2$date_3)

條件_2

如果表_1 $ id2 = table_2 $ id2

**問題:**我嘗試使用下面的程式碼來完成上述任務:

library(sqldf)

sqldf("select distinct * 
 from table_1 a inner join table_2 b
 on (a.date_1 between b.date_2 and b.date_3) and 
    a.id = b.id or (a.id2 = b.id2)")

上面的程式碼執行成功了,但是我不確定邏輯是否正確。

有人可以告訴我我所做的是否正確嗎?

謝謝!

請注意,您還應該始終標記您正在使用的數據庫系統和版本。

看來您的查詢幾乎是正確的,只是您的括號放錯了位置。相反,您應該在條件中的兩組標準周圍加上括號,AND如下所示:

SELECT DISTINCT * 
FROM table_1 a INNER JOIN table_2 b
   ON ((a.date_1 BETWEEN b.date_2 AND b.date_3) AND 
   a.id = b.id) or a.id2 = b.id2

此外,當您在上一個問題中對性能感到疑惑時,您可能想知道在子句中使用OR條件有時會阻礙性能,因為查詢優化難以選擇最有效的索引操作和計劃。(通常)以一種可能更有效的方式重寫使用條件的查詢的另一種方法是改用子句。這是一個範例,說明您的查詢:WHERE``OR``UNION

SELECT DISTINCT * 
FROM table_1 a INNER JOIN table_2 b
   ON (a.date_1 BETWEEN b.date_2 AND b.date_3) AND 
   a.id = b.id

UNION

SELECT DISTINCT * 
FROM table_1 a INNER JOIN table_2 b
   ON a.id2 = b.id2

請注意,我提到這可能更有效,因為與性能調整一樣,兩個查詢之間的測試始終是確定特定案例的真正最佳實現所必需的,並且您的里程可能會有所不同。

引用自:https://dba.stackexchange.com/questions/303443