SQL查询 - 没有一致的密钥 - 根据另一个表中的值在一个表中搜索多个列

时间:2014-09-10 14:30:13

标签: sql sql-server-2014

我正在尝试根据多个条件将PRODUCTS表与PROD_REF表联系起来。问题是加入这两个表没有一致的密钥。

UPC代码对PROD_REF中的每个项目都是唯一的,但PRODUCTS表中可能有多个匹配(或根本不匹配)。我们希望测试来自PRODUCTS表中的列UPC1,UPC2,UPC3,UPC4,UPC5和UPC6的匹配以及PROD_REF中的UPC列。

它变得更加复杂,因为PROD_REF表中的一些(不是全部)UPC代码具有前导零。因此,我们需要考虑" UPC n"来自PRODUCTS的代码是"包含在" PROD_REF中的UPC代码。如果找不到匹配项,那么我们会考虑组合制造商名称和部件号,并希望我们得到一个匹配项。

这也有点棘手,因为通常只有部分匹配制造商名称,但始终与Part#完全匹配。 (但是,不止一个制造商可能拥有与其产品相关的相同部件号。)

那么,有谁想帮我解决这个野兽? :)提前谢谢。

  • PROD_REF表约有300万行。
  • Thee PRODUCTS表是~16K行。

我们可以在任何地方放置索引等。

[产品]

 ID UPC 1       UPC 2       UPC 3       UPC 4   UPC 5   UPC 6   Manufacturer        Manufacturer Part #
 1  78698502014 7869850201  78698404301 NULL    NULL    NULL    RADIATOR SPECIALTY  EB1
 16 78698718101 7869845980  78698459806 NULL    NULL    NULL    RADIATOR SPECIALTY  GR1
 17 45408020007 4540802000  NULL        NULL    NULL    NULL    MAASDAM             144SB-6
 18 45408010008 4540801000  NULL        NULL    NULL    NULL    MAASDAM             144S-6 1
 19 79843002137 7757801495  NULL        NULL    NULL    NULL    FROST KING          3A59
 27 36448124640 3644812464  2906970464  NULL    NULL    NULL    FRANKLIN ELECTRIC P 11010Y152

[PROD_REF]

 ITEM_PIK   UPC             MFR_FULLNAME        MFR_CAT_NUM     MFR_DESCRIPTION     PRODUCT_NAME
 510        78698502014     RADIATOR SPECIALTY  EB1             SUBMERSIBLE         PUMP <-- 1*
 512        78698459806     RADIATOR SPECIALTY  GR1             SUBMERSIBLE         PUMP <-- 2*
 513        045408020007    MAASDAM             144SB-6         DUAL PURPOSE        PUMP <-- 3*
 516        7757801495      FROST KING / EXTRA  3A59            DUAL PURPOSE        PUMP <-- 4*
  • (* 1)匹配UPC 1
  • (* 2)匹配UPC 3
  • (* 3)UPC 1包含在(前导零)
  • (* 4)如果没有UPC匹配,则按制造商匹配(全名或部分名称匹配)和部件号

只需添加更多内容。 我在PROD_REF表中省略了一些细节 - 它还包括描述细节,Image_URL和其他一些项目。

理想情况下,输出看起来如下所示:

      ID    ITEM_PIK    UPC 1       UPC 2       UPC 3       UPC 4   UPC 5   UPC 6   MFR_FULLNAME        PRODUCT_NAME    MFR_CAT_NUM     DESCRIPTION_DETAILS     IMAGE_URL
      1     510         78698502014 7869850201  78698404301 NULL    NULL    NULL    RADIATOR SPECIALTY  PUMP            EB1             Blah, blah, blah        www.abc.com/images/123abc.jpg
      16    512         78698718101 7869845980  78698459806 NULL    NULL    NULL    RADIATOR SPECIALTY  PUMP            GR1             Blah, blah, blah        www.abc.com/images/456abc.jpg
      17    513         45408020007 4540802000  NULL        NULL    NULL    NULL    MAASDAM             PUMP            144SB-6         Blah, blah, blah        www.abc.com/images/789abc.jpg

或者,我很满意只有一个UPC代码匹配的列(如果有的话);所以像:

      ID    ITEM_PIK    UPC         MFR_FULLNAME        PRODUCT_NAME    MFR_CAT_NUM     DESCRIPTION_DETAILS     IMAGE_URL
      1     510         78698502014 RADIATOR SPECIALTY  PUMP            EB1             Blah, blah, blah        www.abc.com/images/123abc.jpg
      16    512         78698718101 RADIATOR SPECIALTY  PUMP            GR1             Blah, blah, blah        www.abc.com/images/456abc.jpg
      17    513         45408020007 MAASDAM             PUMP            144SB-6         Blah, blah, blah        www.abc.com/images/789abc.jpg

1 个答案:

答案 0 :(得分:0)

可能不是最好或最漂亮的解决方案,但我在想这样的事情?至少在第一部分。

SELECT
  ID
  ,ITEM_PIK
  ,UPC1
  ,UPC2
  ,UPC3
  ,UPC4
  ,UPC5
  ,UPC6
  ,MFR_FULLNAME
  ,PRODCUT_NAME
  ,MFR
  ,case when B.PRODUCT_NAME is null then
      case when C.PRODUCT_NAME is null then
         case when D.Product_name is null then
              ..
         else
             d.product_name
         end
      else
        c.product_name
      end
     else
      b.product_name
    end as [Product_Name]
FROM
  PRODUCTS A
  left join [PROD_REF] B ON (A.UPC1 = B.UPC)
  left join [PROD_REF] C ON (A.UPC2 = C.UPC)
  left join [PROD_REF] D ON (A.UPC3 = D.UPC)
  left join [PROD_REF] E ON (A.UPC4 = E.UPC)
  left join [PROD_REF] F ON (A.UPC5 = F.UPC)
  left join [PROD_REF] G ON (A.UPC6 = G.UPC)