-1

我的 LEFT OUTER JOIN 出现问题。我有一组查询,在#Temp 表中提供了大约 80,000 到 1,00000 条记录。现在,当我将这个#Temp 表与另一个表分开时,我必须放置一个 CASE 语句,即如果在与特定列连接时未找到记录,则获取该特定列值并在另一个具有匹配记录。该查询对于特定数据工作正常,但对于较大的数据,它只是继续执行或只是花费太多时间。我的查询是这样的:

SELECT * FROM #Temp 
LEFT OUTER JOIN TABLE1 ON #Temp.Materialcode = 
     CASE WHEN TABLE1.MaterialCode LIKE 'HY%' 
               THEN TABLE1.MaterialCode 
               ELSE REPLACE(TABLE1.MaterialCode,
                            TABLE1.MaterialCode,
                            (SELECT NewMaterialCode 
                                    FROM TABLE2 
                                    WHERE OldMaterialCode = TABLE1.MaterialCode))
     END 

这里 TABLE2 只有两列 NewMaterialCode 和 OldMetarialCode。我要做的是,如果在 TABLE1 LIKE 'HY%' 类型中找不到材料代码,那么它应该采用该材料代码并在 TABLE2 中查找其后续的 NewMaterialCode 以获得具有 'HY' 类型和非'的两种类型的记录HY'型。我想我把我的问题说清楚了。任何帮助将不胜感激。

4

1 回答 1

0
 SELECT *
   FROM #TEMP TMP
        LEFT JOIN Table1 MATERIAL
          ON TMP.MaterialCode = MATERIAL.MaterialCode
        LEFT JOIN Table2 REPLACEMENT
          ON MATERIAL.MaterialCode = REPLACEMENT.OldMaterialCode
   WHERE (        COALESCE(MATERIAL.materialcode, '') LIKE 'HY%'
              AND TMP.materialCode  = MATERIAL.MaterialCode
         )
      OR MATERIAL.MaterialCode =  REPLACEMENT.NewMaterialCode

我认为这应该做你想做的事情,但我真的不知道这些表是如何相关的,除非对你的查询进行逆向工程。

作为记录,您的查询中的 OUTER JOIN 没有完成任何事情,因为外部条件会为 TABLE1 中的列产生空值,并且 case 条件不起作用(NULL 不会匹配 'HY %'也不是 ELSE)。这对于那些不习惯在数据库世界的三值逻辑中工作的人来说是违反直觉的,但这就是为什么我们有COALESCEISNULL.

于 2013-07-17T05:11:29.530 回答