【发布时间】:2018-11-16 06:09:26
【问题描述】:
我想知道在下面的示例中是否有更好的方法来创建我的左连接:
SELECT TOP 10 COALESCE(A.COD_PRODUCT, B.COD_PRODUCT),
COALESCE(A.COD_FAMILY, B.COD_FAMILY),
COALESCE(A.DATE_EXTRACT, B.DATE_EXTRACT),
A.MASS
B.VOLUME
C.PRICE
FROM FIRSTTABLE A FULL JOIN SECONDTABLE B ON B.COD_PRODUCT = A.COD_PRODUCT
AND B.COD_FAMILY = A.COD_FAMILY
AND B.DATE_EXTRACT = A.DATE_EXTRACT
LEFT JOIN THIRDTABLE C ON C.COD_PRODUCT = COALESCE(A.COD_PRODUCT,B.COD_PRODUCT)
AND C.COD_FAMILY = COALESCE(A.COD_FAMILY, B.COD_FAMILY)
AND C.DATE_EXTRACT = COALESCE(A.DATE_EXTRACT, B.DATE_EXTRACT)
这种接缝需要很长时间,我怀疑它非常昂贵且可以改进
编辑:我想在视图中改进这个SELECT FROM JOIN 语句。
【问题讨论】:
-
您已经在
SELECT子句中合并。我想认为 SQL Server 正在对此进行优化,以便它只执行COALESCE()一次,并没有真正增加执行第三次连接的时间,除了必须首先执行它。也许将除第三个连接之外的所有内容都放入子查询中,然后在子查询之外连接(在 SELECTCOALESCE()发生之后)以确保 SQL 服务器只执行一次昂贵的操作。不过,这可能又是一次洗涤。 -
SELECT 语句中的 COALESCE 似乎是不必要的,因为您要加入这些相同的字段。因为当这些字段匹配时您正在加入,所以不会处理任何 NULL 字段,除非两个表都有 NULL。例如,如果
B.COD_PRODUCT = A.COD_PRODUCT等于NULL = NULL,那么将有一行 COD_PRODUCT 为 NULL。但是COALESCE (A.COD_PRODUCT, B.COD_PRODUCT)仍将返回NULL -
当我不在 SELECT 语句中使用 coalesce 时,它会发生一些变化。使用合并时,有 942028 行,其中 3 个第一列都不为空。如果我不使用coalesce,使用表A字段时为640142行,使用表B字段时为490522行。所以我会保持合并。
-
不清楚,你要选择
Top 10 of which table或Top 10 on order by of what column。这是主要标准。
标签: sql sql-server join optimization