首页 > 解决方案 > 在通常的 FROM 子句中添加 JOINS

问题描述

我试图了解我们是否可以在 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无法绑定。

标签: sqlsql-servertsqljoin

解决方案


其实你可以:D

if object_id('tempdb..#tmp1') IS NOT NULL DROP TABLE #tmp1;
if object_id('tempdb..#tmp2') IS NOT NULL DROP TABLE #tmp2;
if object_id('tempdb..#tmp3') IS NOT NULL DROP TABLE #tmp3;
if object_id('tempdb..#tmp4') IS NOT NULL DROP TABLE #tmp4;


CREATE TABLE #tmp1
    (
        id int
        , otherValue varchar(20)
    )
;


CREATE TABLE #tmp2
    (
        id int
        , otherValue varchar(20)
    )
;


CREATE TABLE #tmp3
    (
        id int
        , otherValue varchar(20)
    )
;


CREATE TABLE #tmp4
    (
        id int
        , 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

在此处输入图像描述


推荐阅读