【问题标题】:Select Vendor ID based on another columns' value from another table根据另一个表中另一个列的值选择供应商 ID
【发布时间】:2018-08-29 20:32:53
【问题描述】:

我正在编写一个查询来获取基于在名为ITM_VNDR_PRIORITY 的列中具有最小值的VENDOR_ID 的项目的数据。 ITM_VNDR_PRIORITY 来自另一个共享密钥 VENDOR_ID 的表。

我用来获取供应商与商品关联的查询:

SELECT * 
FROM PS_ITM_VENDOR
WHERE INV_ITEM_ID = '1003'

结果:

 SETID  INV_ITEM_ID   VENDOR_SETID   VENDOR_ID  ITMV_PRIORITY_LOC  ITM_ID_VNDR   ITM_VNDR_PRIORITY
 SHARE  1003          SHARE          84764A     000001             CFG246        3      
 SHARE  1003          SHARE          CAMLAB     000001             CAT895        4
 SHARE  1003          SHARE          GYRENT     000001             TDOC-7FS      2
 SHARE  1003          SHARE          RLMED      000001             CAT895        1

我想为此项目 ID 选择具有最低 ITM_VNDR_PRIORITY 的供应商(在此示例中为 1,即 VENDOR_ID “RLMED”),并且仅将该供应商的行返回到我当前返回所有供应商的下方的此查询中与项目相关联:

SELECT *
FROM PS_ITM_VNDR_UOM UPDEV
WHERE INV_ITEM_ID = '1003'

结果:

SETID   INV_ITEM_ID  VENDOR_SETID  VENDOR_ID   VNDR_LOC
--------------------------------------------------------
SHARE   1003         SHARE         GYRENT      000001
SHARE   1003         SHARE         RLMED       000001
SHARE   1003         SHARE         84764A      000001
SHARE   1003         SHARE         CAMLAB      000001
SHARE   1003         SHARE         GYRENT      000001
SHARE   1003         SHARE         RLMED       000001

我希望此查询根据具有最低 (MIN) 优先级的供应商仅返回与供应商“RLMED”关联的项目。这是我目前所写的,因为我不确定如何仅获取与该项目关联的最小 ITM_VNDR_PRIORITY 的供应商 ID。

SELECT *
FROM PS_ITM_VNDR_UOM UPDEV
LEFT OUTER JOIN PS_ITM_VENDOR UPDEC ON UPDEV.SETID = UPDEC.SETID 
                                    AND UPDEV.INV_ITEM_ID = UPDEC.INV_ITEM_ID 
                                    AND UPDEV.VENDOR_SETID = UPDEC.VENDOR_SETID 
                                    AND UPDEV.VENDOR_ID = UPDEC.VENDOR_ID 
WHERE UPDEV.INV_ITEM_ID = '1003'

在本例中,期望的结果如下(返回具有最低 (MIN) 优先级的供应商“RLMED”):

SETID   INV_ITEM_ID  VENDOR_SETID  VENDOR_ID   VNDR_LOC
--------------------------------------------------------
SHARE   1003         SHARE         RLMED       000001
SHARE   1003         SHARE         RLMED       000001

编辑:

我尝试使用此查询,但它仍然返回所有供应商,而不是最低优先级的供应商

SELECT *
FROM PS_ITM_VNDR_UOM UPDEV
LEFT OUTER JOIN PS_ITM_VENDOR UPDEC ON UPDEV.SETID = UPDEC.SETID 
AND UPDEV.INV_ITEM_ID = UPDEC.INV_ITEM_ID AND UPDEV.VENDOR_SETID = UPDEC.VENDOR_SETID AND UPDEV.VENDOR_ID = UPDEC.VENDOR_ID 
WHERE UPDEV.INV_ITEM_ID = '1003'
 AND EXISTS (SELECT MIN(ITM_VNDR_PRIORITY)
             FROM PS_ITM_VENDOR UPDEC
             WHERE UPDEC.INV_ITEM_ID = UPDEV.INV_ITEM_ID
             AND UPDEC.VENDOR_ID = UPDEC.VENDOR_ID)

【问题讨论】:

  • 任何其他建议表示赞赏!

标签: sql sql-server-2014


【解决方案1】:

我建议使用相关子查询:

SELECT UPDEV.*
FROM PS_ITM_VNDR_UOM UPDEV LEFT OUTER JOIN
     PS_ITM_VENDOR UPDEC
     ON UPDEV.SETID = UPDEC.SETID AND
        UPDEV.INV_ITEM_ID = UPDEC.INV_ITEM_ID AND 
        UPDEV.VENDOR_SETID = UPDEC.VENDOR_SETID AND
        UPDEV.VENDOR_ID = UPDEC.VENDOR_ID 
WHERE UPDEV.INV_ITEM_ID = 1003 AND
      UPDEC.ITM_VNDR_PRIORITY = (SELECT MIN(UPDEC2.ITM_VNDR_PRIORITY)
                                 FROM PS_ITM_VENDOR UPDEC2
                                 WHERE UPDEC2.SETID = UPDEC.SETID AND
                                      UPDEC2.INV_ITEM_ID = UPDEC.INV_ITEM_ID AND 
                                       UPDEC2.VENDOR_SETID = UPDEC.VENDOR_SETID AND
                                       UPDEC2.VENDOR_ID = UPDEC.VENDOR_ID 
                                );

特别是在PS_ITM_VNDR_UOM(INV_ITEM_ID, ITM_VNDR_PRIORITY) 上有一个索引,这应该非常快。

【讨论】:

  • PS_ITM_VNDR_UOM UPDEV 没有列 ITM_VNDR_PRIORITY 所以这不起作用。只有PS_ITM_VENDOR 包含字段ITM_VNDR_PRIORITY
  • 我编辑了上面的帖子,但是我在编辑中尝试的内容仍然无法按预期工作。
猜你喜欢
  • 1970-01-01
  • 2012-03-23
  • 2012-01-30
  • 2020-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多