Sql 条件检索
我有一个现有的冗长查询,检索类似这样的内容(使其看起来更短) 场景:Sql 条件检索,sql,sql-server,Sql,Sql Server,我有一个现有的冗长查询,检索类似这样的内容(使其看起来更短) 场景: R行可能并不总是有T行。但是,如果每个键都存在T行,则将使用T行 我应该只显示每个键数据的T行。 但是,如果键的T不存在,我应该显示R数据 如何通过查询实现这一点 预期产出: 条件1:我将检索那些存在T的Key 条件2:我将检索那些只有R的键 使用行号和分区,如下所示: 您必须根据自己的要求使用以下两个字段,并根据需要应用于条件: RANK() OVER (Partition BY keyvalue order by CASE
R
行可能并不总是有T
行。但是,如果每个键都存在T
行,则将使用T
行
我应该只显示每个键
数据的T
行。
但是,如果键的T
不存在,我应该显示R
数据
如何通过查询实现这一点
预期产出:
条件1:我将检索那些存在T
的Key
条件2:我将检索那些只有R
的键
使用行号
和分区
,如下所示:
您必须根据自己的要求使用以下两个字段,并根据需要应用于条件:
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
输出:
另一种方法是使用联合
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');
你能以合适的格式列出“预期输出”吗?答案将根据你的数据和预期结果而有所不同。因此,请提供更多示例数据,包括大多数可能的场景和预期结果。我可以在其中使用我现有的查询吗?我已经使用了你的选项卡,谢谢你现在摆弄它。
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
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');