在SQL Server中,我只想在字段满足特定条件时才进行连接

时间:2014-05-26 23:36:58

标签: sql case

我不知道怎么说这个但是说tbl1是一大群产品而且tbl2有一堆配件可以与产品相匹配。有两种ID类型:ID和PRODUCT。当tbl1.idtype = PRODUCT时,通常在tbl1中提供另一个名为subGroupID的ID。我试图在ID上链接它们,如果它们碰巧有一个PRODUCT ID,那么将tbl2 id链接到tbl1子组ID。

Select * from tbl1, tbl2
where tb1.idtype=tb2.idtype
and tbl1.id=tbl2.id

if tbl1.idtype=PRODUCT, then join on tbl1.subgroupID=tbl2.id, else don't try to do this join.

我怀疑你应该在这里使用case case,但我一直都会遇到错误。

2 个答案:

答案 0 :(得分:1)

至少有两种方法可以解释这个问题。一种方法是,您希望查看所有PRODUCT类型,并且您还希望加入subgroupID字段而不是普通ID字段。

select ...
from   tbl1
join   tbl2
  on   tbl2.idtype = tbl1.idtype
  and  tbl2.id = tbl1.subgroupID
where  tbl1.idtype = PRODUCT;

但是,您可能也想加入一般情况,只需使用PRODUCT的备用字段。

select ...
from   tbl1
join   tbl2
  on   tbl2.idtype = tbl1.idtype
  and  tbl2.id = case when tbl1.idtype = PRODUCT
         then tbl1.subgroupID
         else tbl1.id
         end
where  ...;

答案 1 :(得分:0)

你所描述的看起来像是N:M的关系,或者如果你喜欢多对多的关系。这意味着产品可以有零件或多件配件,配件可以适合零件或多件产品。如果是这样,您应该使用3个表:Product ProductsAccessories and Accessory。类似的东西:

Product 
  ProductId  PK
  Name
  ...

ProductsAccessories
  ProductsAccessoriesID  PK
  ProductId  FK
  AccessoryId FK

Accessory
  AccessoryId PK
  Name
  ...

这将是最好的方式。

关于你的问题,很难回答你提出的问题,但我认为你正在寻找这样的事情:

SELECT * FROM 
  tbl1
LEFT JOIN tbl2 ON 
  tbl1.subgroupID = tbl2.subgroupID AND
  tbl1.idType = 'PRODUCT'

你可能正在寻找的关键词是LEFT JOIN。它会在结果集中保留没有附件的产品。