所以基本上有1个问题和1个问题:
1. 问题- 当我在一个表中有 100 列(并且没有设置键或 uindex)并且我想加入或子选择该表时,我真的必须写出每个列名吗?
2. 问题- 下面的示例显示了 1. 问题和我实际的 SQL 语句问题
例子:
A.FIELD1,
(SELECT CASE WHEN B.FIELD2 = 1 THEN B.FIELD3 ELSE null FROM TABLE B WHERE A.* = B.*) AS CASEFIELD1
(SELECT CASE WHEN B.FIELD2 = 2 THEN B.FIELD4 ELSE null FROM TABLE B WHERE A.* = B.*) AS CASEFIELD2
FROM TABLE A
GROUP BY A.FIELD1
故事是:如果我不将 CASE 放入它自己的 select 语句中,那么我必须将实际的行名放入 GROUP BY 并且 GROUP BY 不会将 CASE 中的 NULL 值分组,而是将实际值从排。正因为如此,我将不得不加入或选择所有列,因为没有键和 uindex,或者以某种方式找到另一种解决方案。
DBServer 是 DB2。
所以现在只用文字来描述它,没有SQL:我有“订单项目”,可以分为“ZD”和“EK”(1 = ZD,2 = EK),可以按“分销商”分组。即使“订单项目”可以有两个不同的“部门”(ZD、EK)之一,“ZD”和“EK”的字段/行总是都填满。我需要分组来考虑“部门”,并且只有当指定的“部门”(ZD 或 EK)发生变化时,我才希望创建一个新组。
SELECT
(CASE WHEN TABLE.DEPARTEMENT = 1 THEN TABLE.ZD ELSE null END) AS ZD,
(CASE WHEN TABLE.DEPARTEMENT = 2 THEN TABLE.EK ELSE null END) AS EK,
TABLE.DISTRIBUTOR,
sum(TABLE.SOMETHING) AS SOMETHING,
FROM TABLE
GROUP BY
ZD
EK
TABLE.DISTRIBUTOR
TABLE.DEPARTEMENT
这在 GROUP BY 中的 SELECT 和 ZD、EK 中起作用。唯一的问题是,即使 EK 不是指定的 DEPARTEMENT,如果它发生变化,它仍然会打开一个新组,因为他使用的是真正的 EK 值,而不是 CASE 中的 NULL,正如我已经在上面解释的那样。