【问题标题】:Is there any way to avoid sub queries?有什么办法可以避免子查询?
【发布时间】:2014-02-07 09:45:03
【问题描述】:

我在 TEST 表中有以下示例数据:

CREATE TABLE TEST(
f1 varchar(50) NULL,
f2 varchar(50) NULL,
flag int NULL);

INSERT INTO [test]([f1],[f2],[flag]) VALUES('P','a',1);
INSERT INTO [test]([f1],[f2],[flag]) VALUES('P','b',0);
INSERT INTO [test]([f1],[f2],[flag]) VALUES('Q','c',1);
INSERT INTO [test]([f1],[f2],[flag]) VALUES('Q','d',0);
INSERT INTO [test]([f1],[f2],[flag]) VALUES('R','e',1);
INSERT INTO [test]([f1],[f2],[flag]) VALUES('S','f',0);

我想要这个结果:

f1  f2whenFlagIs1   f2whenFlagIs0
P   a               b
Q   c               d
R   e               NULL
S   NULL            f

已编写以下查询以获得相同的结果:

SELECT isnull(test1.f1,test0.f1) f1, test1.f2 f2whenFlagIs1 , test0.f2 AS f2whenFlagIs0
FROM 
(select * from test where flag = 1) AS test1  full JOIN
(select * from test where flag = 0) AS test0 
ON test1.f1 = test0.f1

有什么办法可以避免子查询?

【问题讨论】:

  • +1 样本数据和想要的结果!大多数问题都没有提供,没关系。
  • @abdkok: 你在 (f1,flag) 列上有主键/唯一约束/唯一索引吗?
  • 我删除了Oracle标签,因为这个语法是SQL Server。

标签: sql-server subquery pivot query-performance


【解决方案1】:

这里有两种方法,给定样本数据,假设f1 + flag的每个组合只能有一个值:

SELECT f1, 
  f2WhenFlagIs1 = MAX(CASE WHEN flag = 1 THEN f2 END),
  f2WhenFlagIs0 = MAX(CASE WHEN flag = 0 THEN f2 END)
FROM dbo.TEST
GROUP BY f1;

或者

SELECT f1, f2WhenFlagIs1 = [1], f2WhenFlagIs0 = [0]
FROM dbo.TEST AS t
PIVOT (MAX(f2) FOR flag IN ([0],[1])) AS p;

如果任何给定的f1、flag 对可以有多个值,则需要更好地定义所需的结果。

【讨论】:

  • 感谢您的结果,在大规模数据中哪一个是有效的?
  • @abdkok 不知道,我从未做过任何性能测试。但是,您可以,特别是因为只有您可以访问您的硬件、架构、索引、数据,并理解您所说的“大规模数据”是什么意思...
猜你喜欢
  • 2014-05-25
  • 2017-06-15
  • 2021-11-22
  • 1970-01-01
  • 2017-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多