Сложное объединение на основе результатов совокупной оценки - PullRequest
2 голосов
/ 23 декабря 2010

В SQL Server 2008 у меня есть 3 таблицы: определения, параметры и элементы. Первая таблица содержит минимальное и максимальное значение, которым может быть Param. Params содержит 0 или более параметров для данного определения для элемента. Я хочу получить действительные идентификаторы предметов, выполнив соответствующие условные соединения / evals.

Для иллюстрации:

alt text

ItemID = 1 будет возвращено, потому что ничто в Params не нарушает Definitionss.Min | Max.

ItemsID = 2 не будет возвращено, так как Hi = 103 нарушает Definitions.Max, где DefID = 2. Учитывая это, тот факт, что последняя запись нарушает Definitions.Low, несущественен, но показан для наглядной иллюстрации.

ItemID = 3 будет соответствовать, потому что у него есть Param, который находится в пределах диапазона. Нет необходимости объединять все определения.

1 Ответ

2 голосов
/ 23 декабря 2010

Как насчет

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

Взгляните на этот полный пример

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
                )

1012 * РЕЗУЛЬТАТ *

ItemID
1
3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...