【发布时间】:2021-03-25 21:52:54
【问题描述】:
我有 2 个表,加入时会告诉我与特定产品关联的组织。每个组织都有一个状态,“活跃”或“传统”。我试图只返回“活动”组织,除非没有“活动”组织,然后我想要“传统”组织。如果没有联合,我无法弄清楚如何解决这个问题,我不想使用联合,因为我的一些查询很长而且很复杂。
我当前的方法是两个子查询:一个用于活动的,一个用于旧的,然后在 Excel 中手动组合它们。这是低效且烦人的。我希望也许 CASE 语句可以消除 UNION,但到目前为止我还没有运气。这是该问题的简化图:
组织机构表
|ORG_NAME |ORG_STATUS|PRODUCT_ID|
|--------------|----------|----------|
|Organization 1|Active |1 |
|Organization 2|Legacy |1 |
|Organization 3|Legacy |2 |
|Organization 4|Active |3 |
产品表
|ID|PRODUCT_NAME|
|--|------------|
|1 |Product 1 |
|2 |Product 2 |
|3 |Product 3 |
所需的输出:(我确实可以通过 UNION 获得,但我希望有一个不那么繁琐的解决方案。)
|PRODUCT_NAME|ORG_NAME |ORG_STATUS|
|------------|--------------|----------|
|Product 1 |Organization 1|Active |
|Product 2 |Organization 3|Legacy |
|Product 3 |Organization 4|Active |
如果我使用 UNION 以外的任何东西,我会得到下面的输出,但是当还有一个 Active org 时,我不想要 Legacy org。
|PRODUCT_NAME|ORG_NAME |ORG_STATUS|
|------------|--------------|----------|
|Product 1 |Organization 1|Active |
|Product 1 |Organization 2|Legacy |
|Product 2 |Organization 3|Legacy |
|Product 3 |Organization 4|Active |
我觉得应该有一种简单的方法来根据指定的标准选择填充哪个组织,但我无法找出正确的标准来使其工作。任何帮助将非常感激!提前致谢!
这是简化的联合查询:
SELECT PROD.PRODUCT_NAME, ORG.ORG_NAME
FROM products prod, organizations org
WHERE PROD.ID = ORG.PRODUCT_ID AND ORG.STATUS = 'Active'
UNION
SELECT PROD.PRODUCT_NAME, ORG.ORG_NAME
FROM products prod, organizations org
WHERE PROD.ID = ORG.PRODUCT_ID AND ORG.STATUS = 'Legacy'
AND ORG.PRODUCT_ID NOT IN (SELECT PROD.ID
FROM products prod, organizations org
WHERE ORG.STATUS = 'Active')
我在 select 和 where 语句中都尝试过 CASE,但无法正常工作。下面是其中一种尝试,但这并没有考虑到组织和产品之间的连接,只是给了我所有的组合。我尝试将 org 和 product 连接起来,为我提供一个可以使用的变量,但这也无济于事。可能做不到?
WHEN ORG.STATUS = 'Active' THEN ORG.ORG_NAME
ELSE ORG.ORG_NAME
END
【问题讨论】: