【发布时间】:2016-04-26 17:08:56
【问题描述】:
我要加入 2 个表,例如
PRODUCTS (PRODUCT_ID, NAME)
和
PRICE_LEVELS (PRODUCT_ID, PRICE, PRICE_LVL_NAME )
(ofc。它被简化了,有几个连接)。
在PRICE_LEVELS 表中,我有一些价格水平名称的可能性,比如“DEFAULT”和 LEVEL1,所以我们最终得到如下内容:
PRODUCT_ID | PRICE | PRICE_LVL_NAME
1 | 100 | _DEFAULT_
1 | 50 | LEVEL1
2 | 130 | _DEFAULT_
两个表都在视图中连接。
我需要的是获取价格,但只有一次 - 我的意思是如果定义了 LEVEL1,则选择那个,否则选择 DEFAULT。
与此同时,我使用了 GROUP BY 并且事情似乎有效,但我不知道为什么(ofc。我使用了很多测试数据,它总是有效,但不确定它的可靠性如何)。
假设我们的视图(结合两个表)的名称为 V_PRODUCTS,所以我正在运行查询:
SELECT *
FROM `V_PRODUCTS`
WHERE (PRICE_LVL_NAME = '_DEFAULT_' OR PRICE_LVL_NAME = 'LEVEL1')
GROUP BY `PRODUCT_ID `;
所以问题是:
为什么上面的查询有效? GROUP BY 始终选择 LEVEL1,如果可用,如果不可用,则选择 DEFAULT。这正是我所需要的,但需要了解它为什么会这样工作。
有什么方法可以在 SQL 中更明确地做到这一点?
更新:可能的关卡数量不限
【问题讨论】:
-
您可以加入
PRICE_LEVELS表两次;使用PRICE_LEVEL_NAME='_DEFAULT_'和PRICE_LEVEL_NAME='LEVEL1'作为连接条件。仅当缺少 1 级表中的条目时才选择默认表中的条目。 -
不幸的是,这不是一个选项,因为“级别”是动态的,因此级别类型的数量会有所不同..
-
所以,使用
PRICE_LEVEL_NAME LIKE 'LEVEL%'作为你的条件。 -
LEVEL1 仅作为示例,它在真实数据库中是自动递增的 :)