我想了解我們是否可以在一個FROM子句中把通常的表名以及JOIN放在一起。
比如說--下面這些顯然是可以的:
SELECT *
FROM TABLE1 T1。
TABLE2 T2。
TABLE3 T3
WHERE T1.A = T2.B
AND T2.C = T3.D
SELECT *
FROM TABLE1 T1
JOIN TABLE2 T2 ON T1.A = T2.B
JOIN TABLE3 T3 ON T2.C = T3.D
但是我們能不能把這兩者放在一起使用?
SELECT *
FROM TABLE1 T1。
TABLE2 T2。
TABLE3 T3
JOIN TABLE4 ON T4.X = T3.Y
WHERE T1.A = T2.B
and T2.C = T3.D
我試過上面的選項,但我總是得到一個訊息:T3.Y不能被系結。
uj5u.com熱心網友回復:
實際上你可以:D
if object_id('tempdb. #tmp1') IS NOT NULL DROP TABLE #tmp1。
如果 object_id('tempdb. #tmp2') IS NOT NULL DROP TABLE #tmp2。
如果object_id('tempdb. #tmp3') IS NOT NULL DROP TABLE #tmp3。
如果object_id('tempdb. #tmp4') IS NOT NULL DROP TABLE #tmp4。
CREATE TABLE #tmp1
(
id int , otherValue TABLE #tmp1 (
, otherValue varchar(20)
)
;
創建 TABLE #tmp2
(
id int , otherValue TABLE #tmp2 (
, otherValue varchar(20)
)
;
創建 TABLE #tmp3
(
id int , otherValue TABLE #tmp3 (
, otherValue varchar(20)
)
;
創建 TABLE #tmp4
(
id int , otherValue TABLE #tmp4 (
, otherValue varchar(20)
)
;
INSERT INTO #tmp1 (id, otherValue) VALUES
(1,'who') 。
(2,'what') 。
(3,'when')。
(4, 'where')。
(5, 'why')
;
INSERT INTO #tmp2 (id, otherValue) VALUES
(1,'who') 。
(2,'what') 。
(3,'when')。
(4, 'where')。
(5, 'why')
;
INSERT INTO #tmp3 (id, otherValue) VALUES
(1,'who') 。
(2,'what') 。
(3,'when')。
(4, 'where')。
(5, 'why')
;
INSERT INTO #tmp4 (id, otherValue) VALUES
(1,'who') 。
(2,'what') 。
(3,'when')。
(4, 'where')。
(5, 'why')
;
SELECT *
FROM #tmp1 T1,
#tmp2 T2,
#tmp3 T3
JOIN #tmp4 t4 ON T4.id = T3.id
WHERE T1.id = T2.id
AND T2.id = T3.id
現在,雖然這是可行的,但你應該理解老式的語法實際上是什么--它創建了一個沒有WHERE子句的笛卡爾產品。而且,你唯一需要這樣做的時候是你真正需要一個產品的時候。如果你真的不需要笛卡爾產品,你應該使用 JOIN 語法,這主要是因為它使代碼更易讀,但也有助于其他人將你的表彼此之間的關系放在一起(必須從 WHERE 子句中篩選出這些是一個巨大的痛苦)。
檢查這個:
SELECT *
FROM #tmp1 T1,
#tmp2 T2
uj5u.com熱心網友回復:
你的最終查詢試圖將老式的前ANSI-92隱式連接語法與適當的顯式連接語法混合在一起。
無論如何,你甚至根本不應該使用隱式連接語法。 這個建議的一個原因是,在隱式語法中,WHERE子句同時包含了連接條件和過濾邏輯。 這在閱讀或重構查詢時可能會導致混亂。 在可能的情況下,總是使用顯式連接,并且通常避免將逗號放入FROM子句。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/320173.html
標籤:


