【问题标题】:Get distinct rows for non-key values including keys without window functions获取非键值的不同行,包括没有窗口函数的键
【发布时间】:2022-06-14 20:37:11
【问题描述】:

考虑以下表格和数据:

CREATE TABLE Foo
(
    FooID int NOT NULL PRIMARY KEY,
    FooValue char(1) NOT NULL
);

CREATE TABLE Bar
(
    FooID int NOT NULL,
    BarID int NOT NULL,
    BarValue char(1),
    CONSTRAINT BarPK PRIMARY KEY (FooID, BarID),
    CONSTRAINT FooBar FOREIGN KEY (FooID) REFERENCES Foo(FooID)
);

INSERT INTO Foo(FooID, FooValue) VALUES
    (100, 'A'),
    (101, 'A'),
    (102, 'B'),
    (103, 'C'),
    (104, 'C');

INSERT INTO Bar(FooID, BarID, BarValue) VALUES
    (100, 1, 'X'),
    (100, 2, 'Y'),
    (101, 1, 'X'),
    (101, 2, 'Y'),
    (101, 3, 'Z'),
    (102, 1, 'X'),
    (103, 1, 'Z'),
    (104, 1, 'Z');

从这些数据中,我希望 FooValueBarValue 的每个不同组合及其键都有一行。我并不关心返回了哪些键,因此可能的结果集可能如下所示:

FooID BarID FooValue BarValue
100 1 A X
100 2 A Y
101 3 A Z
102 1 B X
104 1 C Z

通常我会这样做:

WITH NumberedRows AS
    (
        SELECT ROW_NUMBER() OVER
                    (PARTITION BY F.FooValue, B.BarValue ORDER BY F.FooID DESC) AS nr,
                F.FooID, B.BarID, F.FooValue, B.BarValue
            FROM Foo F
                INNER JOIN Bar B
                    ON B.FooID = F.FooID
    )
SELECT FooID, BarID, FooValue, BarValue
    FROM NumberedRows
    WHERE nr = 1;

不幸的是,我不能使用上述解决方案,因为我被限制不使用 CTE 或 ROW_NUMBER()(或任何其他窗口函数,所以 this similar question 没有帮助)。有没有其他方法可以得到想要的结果?

【问题讨论】:

  • “我坚持不使用 CTE 或 ROW_NUMBER()” 为什么这个非常武断的要求?

标签: sql-server tsql


猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多