[英]How to select rows from a table based on a column value in another table that has multiple values?
[英]How to select rows based on column value is repeating and has different values in another column
我需要查詢表以返回行,但是我無法正確查詢表。 這是我的表格視圖:
Id Name Date Subject TrackingToken RegardingObjectId Type TypeName
1 XXXX 8/26/2015 RE: XXXXXX CRM:0030062 496BF810-4DBE-E311-9357-00505686395E 112 RE: YYYY
1 XXXX 8/27/2015 RE: XXXXXX CRM:0030055 AA8C2F71-CDD1-E311-894A-005056863ADA 112 RE: YYYY
1 XXXX 8/28/2015 RE: XXXXXX CRM:0030055 4DF02C89-2FBE-E311-9357-00505686395E 112 RE: YYYY
1 XXXX 8/29/2015 RE: XXXXXX CRM:0030049 496BF810-4DBE-E311-9357-00505686395E 112 RE: YYYY
1 XXXX 8/30/2015 RE: XXXXXX CRM:0030049 06393EF9-71CC-E311-894A-005056863ADA 112 RE: YYYY
1 XXXX 8/31/2015 RE: XXXXXX CRM:0030047 8BE51823-52BE-E311-9357-00505686395E 112 RE: YYYY
1 XXXX 9/1/2015 RE: XXXXXX CRM:0030003 6ABE11CA-BABF-E311-89E9-005056863ADA 112 RE: YYYY
結果集應返回:
Id Name Date Subject TrackingToken RegardingObjectId Type TypeName
1 XXXX 8/27/2015 RE: XXXXXX CRM:0030055 AA8C2F71-CDD1-E311-894A-005056863ADA 112 RE: YYYY
1 XXXX 8/28/2015 RE: XXXXXX CRM:0030055 4DF02C89-2FBE-E311-9357-00505686395E 112 RE: YYYY
1 XXXX 8/29/2015 RE: XXXXXX CRM:0030049 496BF810-4DBE-E311-9357-00505686395E 112 RE: YYYY
1 XXXX 8/30/2015 RE: XXXXXX CRM:0030049 06393EF9-71CC-E311-894A-005056863ADA 112 RE: YYYY
換句話說:選擇所有重復TrackingToken列且RegardingObjectId具有不同值的記錄。
當前查詢:
select [OwnerId],[OwnerIdName],[CreatedOn],[Subject],
[TrackingToken],[RegardingObjectId],
[RegardingObjectTypeCode],[RegardingObjectIdName]
from [TableX].[dbo].[Email] a
where not exists (select [TrackingToken], [RegardingObjectId]
from [TableX].[dbo].[Email] b
where a.[TrackingToken] = b.[TrackingToken]
and a.[RegardingObjectId] = b.[RegardingObjectId]
AND RegardingObjectTypeCode = 112
group by [TrackingToken],[RegardingObjectId]
having count(*)> 1)
and a.TrackingToken in (select TrackingToken
from [TableX].[dbo].[Email]
group by TrackingToken
having count(*) > 1)
and a.RegardingObjectId is not null
and a.RegardingObjectTypeCode = 112
and a.TrackingToken is not null
order by a.TrackingToken desc
您可以計算[RegardingObjectId]的不同數量:
select TrackingToken
from [TableX].[dbo].[Email]
group by TrackingToken
having count(distinct [RegardingObjectId]) > 1
您可以使用COUNT的分析版本對一定范圍內的記錄進行計數(在您的案例中為TrackingToken內)。 然后只保留那些RegardingObjectId的計數大於1的記錄。
select *
from
(
select mytable.*
, count(distinct regardingobjectid) over (partition by trackingtoken) as cnt
from mytable
) counted
where cnt > 1;
編輯:正如Felix Pamittan所指出的那樣,SQL Server並不完全支持COUNT OVER,因此您不能對其使用DISTINCT。 因此,這與常規的COUNT聚合相同:
select mytable.*
from mytable
where
(
select count(distinct token.regardingobjectid)
from mytable token
where token.trackingtoken = mytable.trackingtoken
) > 1;
或沒有相關子查詢,而是派生表:
select mytable.*
from mytable
join
(
select trackingtoken
from mytable
group by trackingtoken
having count(distinct regardingobjectid) > 1
) tokens on tokens.trackingtoken = mytable.trackingtoken;
下面是一個工作示例
CREATE TABLE #X(Id INT,Name NVARCHAR(8),Date DATE,Subject NVARCHAR(16),TrackingToken NVARCHAR(14),RegardingObjectId UNIQUEIDENTIFIER,Type INT,TypeName NVARCHAR(8))
INSERT INTO #X(Id,Name,Date,Subject,TrackingToken,RegardingObjectId,Type,TypeName)
VALUES
(1,'XXXX','8/26/2015','RE: XXXXXX','CRM:0030062','496BF810-4DBE-E311-9357-00505686395E',112,'RE: YYYY'),
(1,'XXXX','8/27/2015','RE: XXXXXX','CRM:0030055','AA8C2F71-CDD1-E311-894A-005056863ADA',112,'RE: YYYY'),
(1,'XXXX','8/28/2015','RE: XXXXXX','CRM:0030055','4DF02C89-2FBE-E311-9357-00505686395E',112,'RE: YYYY'),
(1,'XXXX','8/29/2015','RE: XXXXXX','CRM:0030049','496BF810-4DBE-E311-9357-00505686395E',112,'RE: YYYY'),
(1,'XXXX','8/30/2015','RE: XXXXXX','CRM:0030049','06393EF9-71CC-E311-894A-005056863ADA',112,'RE: YYYY'),
(1,'XXXX','8/31/2015','RE: XXXXXX','CRM:0030047','8BE51823-52BE-E311-9357-00505686395E',112,'RE: YYYY'),
(1,'XXXX','9/1/2015' ,'RE: XXXXXX','CRM:0030003','6ABE11CA-BABF-E311-89E9-005056863ADA',112,'RE: YYYY')
SELECT A.*
FROM #X AS A
INNER JOIN
(
SELECT TrackingToken
FROM #X
GROUP BY TrackingToken
HAVING COUNT(*) > 1
) AS O ON O.TrackingToken = A.TrackingToken
DROP TABLE #X
您可以通過在TrackingToken列中添加索引來對此進行優化
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.