使用基于先前值的不同字段加入相同 Table

Joining Same Table using Different Fields Based on Previous Values

我正在尝试根据另一个 table 中存在的值加入 2 table,特别是在字段为空的情况下。

根据该字段是否为空,我想以不同的方式执行 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 部分是错误的部分,INCORRECT SYNTAX NEAR CASE。据我所知,使用 CASE 不会是选择将其中哪些连接用于产品 table 的有效方法,所以我想知道确定哪些连接需要的正确方法是什么成为 运行,

谢谢。

你试过 If else 语句吗?

我认为你不能那样使用 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 到 return 值,例如:

SELECT ISNULL(p.article_id, q.article_id)

很大一部分问题可能在于您在此子查询中使用了 TOP 1:

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

正如所写,TOP 1 这里的意思是,"Independent of everything else in this query, randomly pick one row from [CRM].[Products], and use that row for my join"

我认为这不是本意 - 在这种情况下,您需要明确说明(如果您不知道 SQL 语法,请使用英语)您尝试使用 TOP 完成的确切目标1.

在这种情况下,如果您提供一些示例数据并显示所需的输出,将会很有帮助。