如果不存在行,则从另一个表中获取它

时间:2014-07-23 11:33:21

标签: sql

我有三个表,它们之间都有共同的产品代码,语言是唯一不同的变量。所以第一个表是我的数据库中Lang列下的所有语言,第二个EN和第三个DE。

所以对于这个问题,我想简单地说明,如果在表中“all”产品代码与“EN”表格中存在lang“EN”,请保留该记录,如果没有找到该记录但是在带有“DE”语言代码的“DE”表并保留该记录。

主键是表之间的SAP_NO,但我不确定如何将其合并到语句中。

select 
[Qry Acc Ass Grp All SKUs].COM_CODE, 
    [Qry Acc Ass Grp All SKUs].SAP_NO, 
    [Qry Acc Ass Grp All SKUs].MANUF_CODE, 
    [Qry Acc Ass Grp All SKUs].MANUF_PART_NO, 
    [Qry Acc Ass Grp All SKUs].SHORT_TEXT_ENG, 
    [Qry Acc Ass Grp All SKUs].MAT_CLASS, 
    [Qry Acc Ass Grp All SKUs].ASSIGNMENT_GRP, 
    [Qry Acc Ass Grp All SKUs].LANG, 
    [Qry Acc Ass Grp All SKUs].DESCR

From  ([Qry Acc Ass Grp All SKUs], [Qry Acc Ass Grp EN] , [Qry Acc Ass Grp DE]

IF EXISTS    
    (
    SELECT *     
    FROM [Qry Acc Ass Grp All SKUs], [Qry Acc Ass Grp EN]    
    WHERE  [Qry Acc Ass Grp All SKUs].LANG = [Qry Acc Ass Grp EN].LANG   

    )    
ELSE
    IF NOT EXISTS
        (
        SELECT *     
    FROM([Qry Acc Ass Grp All SKUs], [Qry Acc Ass Grp DE]    
    WHERE  [Qry Acc Ass Grp All SKUs].LANG = [Qry Acc Ass Grp DE].LANG   
        )


        END;

提前感谢您的帮助和时间!

4 个答案:

答案 0 :(得分:0)

也许你可以通过工会解决这个问题。只需选择两者,然后获取第一个

SELECT TOP 1 *
FROM (
  SELECT Column FROM Language1 -- IF NULL, THEN Language2 is first row
  UNION
  SELECT Column FROM Language2
) tbl

答案 1 :(得分:0)

如果您使用的是SQL Server,则可以使用cross apply执行此操作。查询看起来像这样:

select *
from [Qry Acc Ass Grp All SKUs] a CROSS APPLY
     (select top 1
      from ((select 'EN' as language, 1 as priority, l.* from [Qry Acc Ass Grp EN] l
            ) union all
            (select 'DE' as language, 2 as priority, l.* from [Qry Acc Ass Grp DE] l
            )
           ) l
      order priority
     ) l

答案 2 :(得分:0)

这通常使用与左连接的最佳匹配来完成:

select 
   sku.COM_CODE, 
   sku.SAP_NO, 
   sku.MANUF_CODE, 
   sku.MANUF_PART_NO, 
   sku.SHORT_TEXT_ENG, 
   sku.MAT_CLASS, 
   sku.ASSIGNMENT_GRP, 
   sku.LANG, 
   sku.DESCR,
   coalesce(en.column1, de.column1),-- if english exists, use it, otherwise deutsch
   coalesce(en.column2, de.column2)
From  ([Qry Acc Ass Grp All SKUs] as sku
join [Qry Acc Ass Grp EN] as en -- join english data
  on sku.LANG = en.LANG 
 and sku.SAP_NO = en.SAP_NO
left join [Qry Acc Ass Grp DE] as de -- join german data
  on sku.LANG = de.LANG   
 and sku.SAP_NO = de.SAP_NO

答案 3 :(得分:0)

我不完全理解表之间的引用,但你应该尝试类似:

SELECT [SKUs].COM_CODE, 
    [SKUs].SAP_NO, 
    [SKUs].MANUF_CODE, 
    [SKUs].MANUF_PART_NO, 
    [SKUs].SHORT_TEXT_ENG, 
    [SKUs].MAT_CLASS, 
    [SKUs].ASSIGNMENT_GRP, 
    COALESCE([EN].LANG, [DE].LANG, [SKUs].LANG) LANG, 
    COALESCE([EN].DESCR, [DE].DESCR, [SKUs].DESCR) DESCR
 FROM [SKUs] 
 LEFT JOIN [EN] ON [EN].SAP_NO = [SKUs].SAP_NO 
 LEFT JOIN [EN] ON [DE].SAP_NO = [SKUs].SAP_NO 

我正在使用:

COALESCE - 获得第一个NON NULL值i此订单EN,DE SKU

LEFT JOIN - 如果[EN]或[DE]引用的行不存在,则不限制[SKU]表中的记录