如何获取在另一个表上有多个条目的记录

时间:2019-03-06 16:16:49

标签: sql-server

我的问题的示例场景是:

  

如何获取具有多种地址类型的所有人?

现在这是我的示例数据:

CREATE TABLE #tmp_1 (
    ID uniqueidentifier PRIMARY KEY
    , FirstName nvarchar(max)
    , LastName nvarchar(max)
)

CREATE TABLE #tmp_2 (
    SeedID uniqueidentifier PRIMARY KEY
    , SomeIrrelevantCol nvarchar(max)
)

CREATE TABLE #tmp_3 (
    KeyID uniqueidentifier PRIMARY KEY
    , ID uniqueidentifier REFERENCES #tmp_1(ID)
    , SeedID uniqueidentifier REFERENCES #tmp_2(SeedID)
    , SomeIrrelevantCol nvarchar(max)
)

INSERT INTO #tmp_1
VALUES
('08781F73-A06B-4316-B6A5-802ED58E54BE', 'AAAAAAA', 'aaaaaaa'),
('4EC71FCE-997C-46AA-B119-6C5A2545DDC2', 'BBBBBBB', 'bbbbbbb'),
('B0726ABF-738E-48BC-95CB-091C9D731A0E', 'CCCCCCC', 'ccccccc'),
('6C6CE284-A63C-49D2-B2CC-F25C9CBC8FB8', 'DDDDDDD', 'ddddddd')

INSERT INTO #tmp_2
VALUES
('4D10B4EC-C929-4D6B-8C94-11B680CF2221', 'Value1'),
('4C891FE9-60B6-41BE-A64B-11A9A8B58AB2', 'Value2'),
('6F6EFED6-8EA0-4F70-A63F-6A103D0A71BD', 'Value3')

INSERT INTO #tmp_3
VALUES
(NEWID(), '08781F73-A06B-4316-B6A5-802ED58E54BE', '4D10B4EC-C929-4D6B-8C94-11B680CF2221', 'sdfsdgdfbgcv'),
(NEWID(), '08781F73-A06B-4316-B6A5-802ED58E54BE', '4C891FE9-60B6-41BE-A64B-11A9A8B58AB2', 'asdfadsas'),
(NEWID(), '08781F73-A06B-4316-B6A5-802ED58E54BE', '4C891FE9-60B6-41BE-A64B-11A9A8B58AB2', 'xxxxxeeeeee'),
(NEWID(), '4EC71FCE-997C-46AA-B119-6C5A2545DDC2', '4D10B4EC-C929-4D6B-8C94-11B680CF2221', 'sdfsdfsd'),
(NEWID(), 'B0726ABF-738E-48BC-95CB-091C9D731A0E', '4D10B4EC-C929-4D6B-8C94-11B680CF2221', 'zxczxcz'),
(NEWID(), 'B0726ABF-738E-48BC-95CB-091C9D731A0E', '6F6EFED6-8EA0-4F70-A63F-6A103D0A71BD', 'eerwerwe'),
(NEWID(), '6C6CE284-A63C-49D2-B2CC-F25C9CBC8FB8', '4D10B4EC-C929-4D6B-8C94-11B680CF2221', 'vbcvbcvbcv')

哪个给你:

Table Data

这是我的尝试:

SELECT
    t1.*
    , Cnt -- not really needed. Just added for visual purposes
FROM #tmp_1 t1
LEFT JOIN (
    SELECT
        xt.ID
        , COUNT(1) Cnt
    FROM (
        SELECT
            #tmp_3.ID
            , COUNT(1) as Cnt
        FROM #tmp_3
        GROUP BY ID, SeedID
    ) xt
    GROUP BY ID
) t2
    ON t1.ID = t2.ID
WHERE t2.Cnt > 1

哪个给:

ID                                      FirstName   LastName    Cnt
B0726ABF-738E-48BC-95CB-091C9D731A0E    CCCCCCC      ccccccc     2
08781F73-A06B-4316-B6A5-802ED58E54BE    AAAAAAA      aaaaaaa     2

尽管这给了我正确的结果,但由于内部查询,恐怕此查询不是执行此性能的正确方法。非常感谢任何输入。

注意:

  1. 一个人可以有多个相同地址类型的地址。
  2. “人员地址”不是确切的用例。这只是一个例子。
  3. 结果集中确实不需要Cnt列。

1 个答案:

答案 0 :(得分:-1)

命名示例表和数据的方式对理解问题几乎没有帮助。

我认为您希望所有ID在最后一个表中具有2个或多个SomeIrrelevantCol值的ID? 可以通过以下方式完成:

select * from #tmp_1
where ID in
(
    select ID
    from #tmp_3
    group by ID
    having count(distinct SomeIrrelevantCol)>=2
)