Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何水平组合两个查询?_Sql Server - Fatal编程技术网

Sql server 如何水平组合两个查询?

Sql server 如何水平组合两个查询?,sql-server,Sql Server,我对以下查询进行了编码: SELECT u.LastName Col1 , convert(varchar, COALESCE(COUNT(DISTINCT pm.PhraseId), 0)) AS Col2 , convert(varchar, COALESCE(COUNT(DISTINCT pc.PhraseId), 0)) AS Col3 FROM dbo.AspNetUsers u LEFT JOIN dbo.Phrase pm ON u.Id = pm.ModifiedBy LEFT

我对以下查询进行了编码:

SELECT u.LastName Col1
, convert(varchar, COALESCE(COUNT(DISTINCT pm.PhraseId), 0)) AS Col2
, convert(varchar, COALESCE(COUNT(DISTINCT pc.PhraseId), 0)) AS Col3
FROM dbo.AspNetUsers u
LEFT JOIN dbo.Phrase pm ON u.Id = pm.ModifiedBy
LEFT JOIN dbo.Phrase pc ON u.Id = pc.CreatedBy
GROUP BY u.LastName
性能非常差,运行了一分钟多

然后我尝试将其分解为两个查询,每个查询只需两秒钟即可运行:

SELECT u.LastName Col1
, convert(varchar, COALESCE(COUNT(DISTINCT pm.PhraseId), 0)) AS Col2
FROM dbo.AspNetUsers u
LEFT JOIN dbo.Phrase pm ON u.Id = pm.ModifiedBy
GROUP BY u.LastName

SELECT u.LastName Col1
, convert(varchar, COALESCE(COUNT(DISTINCT pc.PhraseId), 0)) AS Col2
FROM dbo.AspNetUsers
LEFT JOIN dbo.Phrase pm ON u.Id = pc.CreatedBy
GROUP BY u.LastName
由于第一个查询无法运行,我想找到一些方法来组合两个较小查询的输出。 以下是我希望与DDL表相处的结果:

我有两张桌子:

CREATE TABLE [dbo].[Phrase] (
    [PhraseId]     UNIQUEIDENTIFIER DEFAULT (newid()) NOT NULL,
    [English]      NVARCHAR (250)   NOT NULL,
    [CreatedBy]    INT              DEFAULT ((1)) NOT NULL,
    [ModifiedBy]   INT              DEFAULT ((1)) NOT NULL,
    PRIMARY KEY CLUSTERED ([PhraseId] ASC)
);

CREATE TABLE [dbo].[AspNetUsers] (
    [Id]                   INT            IDENTITY (1, 1) NOT NULL,
    [FirstName]            NVARCHAR (MAX) NULL,
    [LastName]             NVARCHAR (MAX) NULL,
    CONSTRAINT [PK_dbo.AspNetUsers] PRIMARY KEY CLUSTERED ([Id] ASC)
);

Col1       Col2        Col3

ad1        100           50
ad2        10             5
ad3        200           99
请注意,我的索引如下:

create nonclustered index ix_Phrase_CreatedBy on dbo.Phrase (CreatedBy)
create nonclustered index ix_Phrase_ModifiedBy on dbo.Phrase (ModifiedBy)
我非常感谢关于如何组合较小的2秒运行时查询的建议,因为我认为
我无法快速运行第一个查询。不确定这是SQL Server问题还是什么问题使用

正如我在这里提到的:

您也不需要使用
count(distinct…
,因为
PhraseId
是唯一的,或者
coalesce()

雷克斯测试仪:

您也可以尝试将左连接替换为
outer apply()
,但我不知道这是否有帮助:

select
    u.LastName
  , CreatedByQty =count(pc.CreatedBy)
  , ModifiedByQty=pm.ModifiedByQty
from dbo.AspNetUsers u
  left join dbo.Phrase pc
    on u.Id = pc.CreatedBy
outer apply (
    select ModifiedByQty=count(1) 
    from dbo.Phrase pm
    where u.Id = pm.ModifiedBy
    ) pm
group by u.LastName
select
    u.LastName
  , CreatedByQty =count(pc.CreatedBy)
  , ModifiedByQty=pm.ModifiedByQty
from dbo.AspNetUsers u
  left join dbo.Phrase pc
    on u.Id = pc.CreatedBy
outer apply (
    select ModifiedByQty=count(1) 
    from dbo.Phrase pm
    where u.Id = pm.ModifiedBy
    ) pm
group by u.LastName