使用基于先前值的不同字段加入相同 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 语句中,使用 ISNULL
或 COALESCE
到 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.
在这种情况下,如果您提供一些示例数据并显示所需的输出,将会很有帮助。
我正在尝试根据另一个 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 语句中,使用 ISNULL
或 COALESCE
到 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.
在这种情况下,如果您提供一些示例数据并显示所需的输出,将会很有帮助。