基于聚合评估结果的棘手连接

发布于 2024-10-09 01:32:16 字数 441 浏览 0 评论 0原文

在 SQL Server 2008 中,我有 3 个表:定义、参数和项目。第一个表包含参数可能的最小值和最大值。对于某个项目,Params 包含 0 个或多个针对给定定义的参数。我希望通过执行适当的条件连接/评估来获取有效的项目 ID。

举例来说:

alt text

将返回 ItemID = 1,因为 Params 中的任何内容均不违反 Definitions.Min|Max。

ItemsID = 2 不会被返回,因为 Hi = 103 违反了 Definitions.Max,其中 DefID = 2。鉴于此,最后一个条目违反 Definitions.Low 的事实是无关紧要的,但显示是为了清楚地说明。

ItemID = 3 将匹配,因为它的参数在范围内。无需加入所有定义。

In SQL Server 2008, I have 3 tables: Definitions, Params, and Items. The fist table contains the min and max value that a Param may be. Params contains 0 or more parameters against a given definition, for an item. I wish to get the valid Item IDs by doing the appropriate conditional joins/evals.

To illustrate:

alt text

ItemID = 1 would be returned because nothing in Params violates Definitions.Min|Max.

ItemsID = 2 would not be returned because Hi = 103 violates Definitions.Max where DefID = 2. Given this, the fact the last entry violates Definitions.Low is inconsequential, but shown for clear illustration.

ItemID = 3 will match because it has a Param that is within range. There is no need to join all Definitions.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

匿名的好友 2024-10-16 01:32:16

怎么样

SELECT  *
FORM    Items i INNER JOIN
        Params p    ON  i.ItemID = p.ItemID INNER JOIN
        Definitions d   ON  p.DefinationID = d.DEfinationID
WHERE   p.Hi <= d.Max
AND         p.Low >= d.Min

编辑

编辑看看这个完整的示例

DECLARE @Items TABLE(
        ItemID INT
)
DECLARE @Params TABLE(
        DefID INT,
        ItemID INT,
        Low FLOAT,
        Hi FLOAT
)
DECLARE @Defs TABLE(
        DefID INT,
        [Min] FLOAT,
        [Max] FLOAT
)

INSERT INTO @Items SELECT 1
INSERT INTO @Items SELECT 2
INSERT INTO @Items SELECT 3

INSERT INTO @Params SELECT 1, 1, 11, 18
INSERT INTO @Params SELECT 1, 1, 13, 17
INSERT INTO @Params SELECT 2, 1, 25, 80

INSERT INTO @Params SELECT 1, 2, 12, 15
INSERT INTO @Params SELECT 1, 2, 14, 15
INSERT INTO @Params SELECT 2, 2, 50, 80
INSERT INTO @Params SELECT 2, 2, 50, 103
INSERT INTO @Params SELECT 2, 2, 10, 80

INSERT INTO @Params SELECT 2, 3, 24, 60

INSERT INTO @Defs SELECT 1, 10, 20
INSERT INTO @Defs SELECT 2, 20, 100

;WITH InvalidValues AS (
        SELECT  DISTINCT
                i.ItemID
        FROM    @Items i INNER JOIN
                @Params p   ON  i.ItemID = p.ItemID INNER JOIN
                @Defs d ON  p.DefID = d.DefID
        WHERE   p.Low < d.[Min]
        OR      p.Hi > d.[Max]
)
SELECT  *
FROM    @Items i 
WHERE   NOT EXISTS  (
                        SELECT  1
                        FROM    InvalidValues
                        WHERE   ItemID = i.ItemID
                    )
AND     EXISTS  (
                    SELECT  1
                    FROM    @Params p
                    WHERE   ItemID = i.ItemID
                )

结果

ItemID
1
3

How about

SELECT  *
FORM    Items i INNER JOIN
        Params p    ON  i.ItemID = p.ItemID INNER JOIN
        Definitions d   ON  p.DefinationID = d.DEfinationID
WHERE   p.Hi <= d.Max
AND         p.Low >= d.Min

EDIT

Have a look at this full example

DECLARE @Items TABLE(
        ItemID INT
)
DECLARE @Params TABLE(
        DefID INT,
        ItemID INT,
        Low FLOAT,
        Hi FLOAT
)
DECLARE @Defs TABLE(
        DefID INT,
        [Min] FLOAT,
        [Max] FLOAT
)

INSERT INTO @Items SELECT 1
INSERT INTO @Items SELECT 2
INSERT INTO @Items SELECT 3

INSERT INTO @Params SELECT 1, 1, 11, 18
INSERT INTO @Params SELECT 1, 1, 13, 17
INSERT INTO @Params SELECT 2, 1, 25, 80

INSERT INTO @Params SELECT 1, 2, 12, 15
INSERT INTO @Params SELECT 1, 2, 14, 15
INSERT INTO @Params SELECT 2, 2, 50, 80
INSERT INTO @Params SELECT 2, 2, 50, 103
INSERT INTO @Params SELECT 2, 2, 10, 80

INSERT INTO @Params SELECT 2, 3, 24, 60

INSERT INTO @Defs SELECT 1, 10, 20
INSERT INTO @Defs SELECT 2, 20, 100

;WITH InvalidValues AS (
        SELECT  DISTINCT
                i.ItemID
        FROM    @Items i INNER JOIN
                @Params p   ON  i.ItemID = p.ItemID INNER JOIN
                @Defs d ON  p.DefID = d.DefID
        WHERE   p.Low < d.[Min]
        OR      p.Hi > d.[Max]
)
SELECT  *
FROM    @Items i 
WHERE   NOT EXISTS  (
                        SELECT  1
                        FROM    InvalidValues
                        WHERE   ItemID = i.ItemID
                    )
AND     EXISTS  (
                    SELECT  1
                    FROM    @Params p
                    WHERE   ItemID = i.ItemID
                )

REsult

ItemID
1
3
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文