例如我有一张表
| ID | Key | Value |
--------------------
| 1 | a | 123 |
| 2 | b | 354 |
| 3 | c | 980 |
| 4 | b | 354 |
| 5 | a | 123 |
我希望获得Key
和Value
相等的群组。所以它将是
| 1 | a | 123 |
| 5 | a | 123 |
--------------------
| 2 | b | 354 |
| 4 | b | 354 |
--------------------
| 3 | c | 980 |
然后对于每个组我想要执行一些操作。比如检查每个ID
的另一个表中的某些值并设置一些标志......
我认为GROUP BY
在这里很有用,但我不知道如何实现我想要的目标。
修改
如果你需要行动的例子......
假设我有另一个表ID
是外键。
| ID | Name | Address | IsActive |
对于每个群组,如果此群组中的任何项目都有地址,我想要查询,并为该群组中的所有其他项目设置IsActive
至false
。
答案 0 :(得分:0)
答案 1 :(得分:0)
这似乎有效。
CREATE TABLE #TEMP
(ID INT, [KEY] NVARCHAR(10), VALUE INT)
INSERT INTO #TEMP VALUES ('1', 'A', '123'),
( '2', 'b', '354'),
( '3', 'c', '980'),
('4', 'b', '354'),
('5', 'a', '123')
SELECT ID, [KEY], VALUE
FROM #TEMP
GROUP BY [KEY], VALUE, ID
这实现了分组。要执行操作,您需要实施一个CASE WHEN来检查您要加入的表。
CREATE TABLE #ADDRESS
([ADDRESS] NVARCHAR(25), ID INT)
INSERT INTO #ADDRESS VALUES ('123 MAIN ST', '1')
SELECT A.ID, A.[KEY], A.VALUE,
CASE WHEN B.[ADDRESS] IS NOT NULL THEN 'ACTIVE' ELSE 'INACTIVE' END AS 'ACTIVE?'
FROM #TEMP A
LEFT JOIN #ADDRESS B
ON A.ID = B.ID
GROUP BY A.[KEY], A.VALUE, A.ID, B.[ADDRESS]