2015-11-04 67 views
0

我试图根据另一个表中存在的值(特别是字段为空)来加入2个表。根据以前的值使用不同字段加入相同的表

根据该字段是否为空,我想以不同的方式执行LEFT JOIN。

实施例:

  LEFT JOIN (SELECT report_transaction_id, line_number, sale_staff_id, item_type, article_id, sale_count, return_count, line_price_inc_vat, merchandise_category 
         FROM [CRM].[TransactionItems]) ti 
      ON th.report_transaction_id = ti.report_transaction_id 

CASE ti.article_id WHEN IS NULL THEN 

      LEFT JOIN (SELECT TOP 1 article_id, merchandise_category, long_desc, division_code, division_desc, group_code, group_desc 
         FROM [CRM].[Products]) p 
      ON ti.MERCHANDISE_CATEGORY = p.MERCHANDISE_CATEGORY 
ELSE 
     LEFT JOIN (SELECT article_id, merchandise_category, long_desc, division_code, division_desc, group_code, group_desc 
         FROM [CRM].[Products]) p 
      ON ti.article_id = p.article_id 

END 

的情况下部分是示数,与附近有语法错误CASE的部分。据我所知,使用CASE不是一种有效的方式来选择Products表中使用哪些连接,所以我想知道确定哪个连接需要运行的正确方法,

谢谢。

+0

尝试'CASE什么时候ti.article_id是NULL那么' – markpsmith

+0

不幸的是仍然有相同的错误。这正是我之前将ti.article_id移到之前的时间 –

回答

0

我不认为你可以使用CASE这样,你将不得不做这样的事情:

LEFT JOIN (SELECT TOP 1 article_id, merchandise_category, long_desc, division_code, division_desc, group_code, group_desc 
FROM [CRM].[Products]) p 
ON ti.MERCHANDISE_CATEGORY = p.MERCHANDISE_CATEGORY 
WHERE ti.article_id IS NULL 
LEFT JOIN (SELECT article_id, merchandise_category, long_desc, division_code, division_desc, group_code, group_desc 
FROM [CRM].[Products]) p 
ON ti.article_id = p.article_id 
WHERE ti.article_id IS NOT NULL 

加入两个子查询,但在where子句中使用ti.article_id

你将不得不使用不同的别名第二子查询(如“Q”),并在主SELECT语句,使用ISNULLCOALESCE返回值,例如:

SELECT ISNULL(p.article_id, q.article_id) 
+0

我担心这是CASE关键字和连接的情况。 我尝试了推荐的解决方案(使用q进行第二次连接,并且不得不用WHERE替换AND),但没有收到预期的结果。 p/q表中的所有字段都返回空值。 –

+0

从头开始,我使用的数据出现问题。这现在看起来适用于NULL字段以及可以与商品表匹配的商品ID,但不适用于无法匹配的商品ID。然而,这比我现在得到的更进一步,谢谢! :) –

0

你用If If语句试过吗?

+0

我一直试图让它设置一个If Else语句可以使用的变量,但一直没有太大的运气。 If语句似乎并不想将字段作为空值作为参数 –

0

的很大一部分这个问题可能是你使用TOP 1的这个子查询:

(SELECT TOP 1 article_id, merchandise_category, long_desc, division_code, 
       division_desc, group_code, group_desc 
FROM [CRM].[Products]) 

书面,TOP 1这里的意思是,“在此查询一切的独立,随机挑选从[CRM] [产品一行。 ],并使用该行作为我的连接“

我认为这不是意图 - 在这种情况下,你需要澄清(英文,如果你不知道SQL语法)你想用TOP 1

完成什么如果您提供了一些样本数据并显示了期望的输出,这真的是一个有用的情况。

+0

不幸的是,TOP 1似乎是我所要做的事情的一部分。如果商品ID不存在,那么将使用merchandise_category字段来加入信息。 merchandise_category字段不是唯一的,这意味着每个merchandise_category可能有数千个记录。随机选择一个似乎是当前接受的要求(通过额外的字段对产品进行排序会导致查询花费太长的时间来处理) –

+0

是的,但是您的语法并不是说“从所有(随机)与商品类别匹配的行“。它是说,“从整个表格中随机选取一行”。 – KevinKirkpatrick

相关问题