首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >条件检索

条件检索
EN

Stack Overflow用户
提问于 2018-02-01 05:39:48
回答 2查看 38关注 0票数 1

我有一个现有的冗长查询,它检索类似的内容(使它看起来更短)。

代码语言:javascript
复制
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:我将检索存在KeyT

代码语言:javascript
复制
 Field1 Field2 Key
 ------ ------ ---
 T      CAF21  2

条件2:我将检索那些只包含KeyR

代码语言:javascript
复制
 Field1 Field2 Key
 ------ ------ ---
 R      NULL   3
 R      NULL   1
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-02-01 05:48:22

ROW_NUMBERPartition By一起使用如下所示:

您必须为您的需求处理以下两个字段,并根据需要在需要的情况下应用:

代码语言:javascript
复制
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;

整个查询:

代码语言:javascript
复制
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  

输出:

票数 2
EN

Stack Overflow用户

发布于 2018-02-01 05:56:56

另一种方法是使用UNION

代码语言:javascript
复制
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');
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48556044

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档