繁体   English   中英

SQL 中的 where 子句条件

[英]where clause conditions in SQL

下面是一个基于 where 子句的连接:

SELECT a.* FROM TEST_TABLE1 a,TEST_TABLE2 b,TEST_TABLE3 c
WHERE a.COL11 = b.COL11
AND b.COL12 = c.COL12
AND a.COL3 = c.COL13;

我一直在从在线资源中学习 SQL 并尝试使用连接进行转换

两个问题:

  • 原始查询令人困惑。 外部连接(带有(+)后缀)与最后一个where条件无关。 由于这种情况,查询应该只返回存在实际匹配c记录的记录。 因此,原始查询与没有此类(+)后缀相同。
  • 您的查询加入了TEST_TABLE3两次,而第一个查询只加入了一次,并且有两个条件决定了它是如何加入的。 您不应将这些条件拆分为两个单独的连接。

顺便说一句,令人惊讶的是 SQL Fiddle 站点没有显示错误,因为两次使用相同的别名是没有意义的。 例如,请参阅 MySQL 如何使用dbfiddle上的相同查询返回错误(在所有可用版本的 MySQL 上):

不是唯一的表/别名:'C'

因此,要使用标准join表示法获得相同的结果,所有连接都应该是inner连接:

SELECT * 
FROM  TEST_TABLE1 A
INNER JOIN  TEST_TABLE2 B
        ON A.COL11 = B.COL11
INNER JOIN TEST_TABLE3 C
        ON A.COL11 = B.COL11
        AND B.COL12 = C.COL12;

@tricot 正确地指出,拥有 2 个具有相同名称的别名并且没有出现错误是很奇怪的。 另外,回答您的问题:在第一个查询中,我们首先通过指定所有表名来在所有 3 个表之间执行交叉连接 之后,我们使用执行交叉连接后得到的 output 上的WHERE子句中指定的条件过滤行。 第二个查询中,您只需加入test_table3一次。 由于现在您拥有所有必需的别名 A、B、C,就像在第一个查询中一样,因此您可以在最后一次连接后指定 2 个条件,如下所示:

SELECT A.* FROM  TEST_TABLE1 A
LEFT JOIN  TEST_TABLE2 B
ON A.COL11 = B.COL11
left join TEST_TABLE3 C
on B.COL12 =C.COL12 AND  A.COL3 = C.COL13;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM