Исключить записи

#sql

#sql

Вопрос:

Мне нужно исключить данные, основанные на двух столбцах, присутствующих в другой таблице.

Таблица 1 содержит 2 столбца a и b. Таблица 2 содержит 3 столбца a, b, c. столбцы B и C представляют диапазон.для некоторых записей у нас нет диапазона. пример приведен ниже.

Данные таблицы 2,

 Column A   Column B   Column C
1           1         10
2           5         NULL
2           8         NULL
2          25         50
3          10         100
4           7         10
4           2         NULL
 

Нам нужно исключить записи из таблицы 1 на основе данных таблицы 2. таблица1.столбец A = таблица2.столбец A и таблица 1.столбец b между таблицой2.столбец b и таблицой2.столбец c.

Таблица 1 содержит сотни записей, но нам нужно исключить данные table2 из данных table1. в таблице 1 приведены примеры данных, приведенные ниже.

 ColumnA Column B
1        4
1       14
1       15
2        1
2        5
 

нам нужно исключить 1-ю запись и 5-ю запись из таблицы 2.

Пожалуйста, помогите мне решить эту проблему как можно скорее?

Комментарии:

1. Просьба о помощи «как можно скорее» обычно оказывает на SO противоположный эффект.

2. Что NULL представляет a в Table2.ColumnC ? Нет верхней границы? Относится ли то же самое к ColumnB (т. Е. Без нижней границы)?

3. @Tony: время придумать «ALAP» 😉

4. пользователи с 1 pt не получают специального обращения, особенно help ASAP

Ответ №1:

Я предполагаю, что a NULL в любом Column B или Column C in Table2 не представляет нижней или верхней границы диапазона соответственно.

Попробуйте это

 SELECT ColumnA, ColumnB
FROM Table1
WHERE NOT EXISTS (
    SELECT 1 FROM Table2
    WHERE Table1.ColumnA = Table2.ColumnA
    AND ((
        Table2.ColumnC IS NULL
        AND Table1.ColumnB >= Table2.ColumnB
    ) OR (
        Table2.ColumnB IS NULL
        AND Table1.ColumnB <= Table2.ColumnC
    ) OR (
        Table1.ColumnB BETWEEN Table2.ColumnB AND Table2.ColumnC
    ))
)
 

Ответ №2:

В этом вопросе отсутствует много необходимой информации, чтобы грамотно ответить на него, поэтому я заранее перечислю свои предположения. В будущем вам поможет добавление поставщика SQL, который вы используете, и значение ваших данных поможет людям.

Я предполагаю, что вы используете MSSQL 2008 R2, что данные в таблице 2 представляют собой ряд исключающих диапазонов, в которые не должно попадать значение из таблицы 1, и что значение NULL в столбце C означает, что диапазон является открытым.

Учитывая все сказанное, ответ на ваш вопрос легче всего ответить с помощью объединений. Если это новая концепция для вас, вы можете просмотреть этот пост о соединениях в реляционных базах данных http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html а также документация по объединению для вашей конкретной СУБД.

В MSSQL вы могли бы выполнить это, выполнив что-то вроде следующего:

 With ValuesInRange
AS
(
   Select distinct ColumnA, ColumnB from Table1 
   Join Table2 on Table1.A = Table2.A
   AND Table1.ColumnB >= Table2.ColumnA 
   AND Table1.ColumnB <= isnull(Table2.ColumnC, Table1.ColumnB)
)
Select * from Table1 a
OUTER Join ValuesInRange b 
ON a.ColumnA = b.ColumnA AND a.ColumnB = b.ColumnB
Where b.ColumnA IS NULL
 

Используя CTE, вы избегаете необходимости переиздавать запрос для каждой строки и должны получить незначительно лучшую производительность. Если у вас всего несколько сотен строк, это не должно иметь большого значения.

Комментарии:

1. спасибо за это. Мне нужно исключить записи по другой причине (без нулей), и я думаю, что ваш ответ может сработать для меня. Я пытался избежать старого SELECT * ИЗ ТАБЛИЦЫ, ГДЕ ПОЛЕ ОТСУТСТВУЕТ (ВЫБЕРИТЕ ПОЛЕ ИЗ ТАБЛИЦЫ)