#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 * ИЗ ТАБЛИЦЫ, ГДЕ ПОЛЕ ОТСУТСТВУЕТ (ВЫБЕРИТЕ ПОЛЕ ИЗ ТАБЛИЦЫ)