我有一个现有冗长的查询,可以检索这样的东西(使它看起来更短)。
Field1 Field2 Key
------ ------ ---
R NULL 2
T CAF21 2
R NULL 1
R NULL 3
场景:
R
行可能并不总是有T
行。但是,如果每个键都存在T
行,则会使用T
行。
我应该只为每个T
数据显示Key
行。
但是,如果T
不存在Key
,我应该显示R
数据。
如何通过查询实现此目的?
预期产出:
条件1:我会检索那些
Key
已存在的T
Field1 Field2 Key
------ ------ ---
T CAF21 2
条件2:我将检索仅
的Key
R
Field1 Field2 Key
------ ------ ---
R NULL 3
R NULL 1
答案 0 :(得分:2)
USE ROW_NUMBER
与Partition By
如下:
您必须根据您的要求使用以下两个字段,并根据需要应用于条件:
RANK() OVER (Partition BY keyvalue order by CASE field1 WHEN 'T' THEN 0 ELSE 1 END) AS PartNo,
CASE field1 WHEN 'T' THEN 1 ELSE 2 END AS fieldValue;
整个查询:
DECLARE @tblQuestion AS Table
(
field1 varchar(20),
field2 VARCHAR(50),
keyvalue INT
)
INSERT INTO @tblQuestion VALUES('R',NULL,2)
INSERT INTO @tblQuestion VALUES('T','CAFR',2)
INSERT INTO @tblQuestion VALUES('R',NULL,1)
INSERT INTO @tblQuestion VALUES('R',NULL,3)
;WITH T AS
(
SELECT
field1,
field2,
keyvalue,
ROW_NUMBER() OVER (Partition BY keyvalue order by CASE field1 WHEN 'T' THEN 0 ELSE 1 END) AS PartNo,
CASE field1 WHEN 'T' THEN 1 ELSE 2 END AS fieldValue
FROM @tblQuestion
)
SELECT
*
FROM T
<强>输出:强>
答案 1 :(得分:1)
另一种方法是使用UNION
SELECT FIELD1, FIELD2, KEY
FROM YOUR_TABLE
WHERE FIELD1 = 'T'
UNION
SELECT FIELD1, FIELD2, KEY
FROM YOUR_TABLE
WHERE KEY NOT IN (SELECT DISTINCT KEY FROM YOUR_TABLE WHERE FIELD1 = 'T');