#sql #sql-server
#sql #sql-сервер
Вопрос:
У меня есть две таблицы
Таблица A — Информация о продукте — цвет, размер и т.д. … (product_id, цвет, размер …)
Таблица B — Информация о скорости — скорость может варьироваться в зависимости от цвета, размера, состояния и т.д. … (rate_id, product_id, цвет, размер, состояние, скорость)
Не все продукты имеют тарифы, которые различаются по цвету, размеру, состоянию и т.д…Это зависит от продукта
Если это так, то только атрибуты, по которым изменяются ставки, имеют значение в таблице ставок, например, если цена продукта X не зависит от размера или состояния, а зависит от цвета, в таблице ставок будут записи с разными значениями цвета, но поле размер, состояние будет иметь значение null.
Есть ли способ в SQL получить правильное значение rate для продукта — я не могу сопоставить по всем атрибутам продукта, потому что может не быть соответствующей строки
Что мне нужно, так это запрос, который получает скорость, связанную с продуктом X, и будет работать с другими продуктами, ставки которых могут варьироваться в зависимости от другого набора атрибутов.
Комментарии:
1. Я думаю, вам лучше всего было бы упростить схему. Таблица A не должна содержать информацию о цвете или размере. Таблица B всегда должна содержать одну или несколько строк для данного product_id. Вы всегда выполняете ВНУТРЕННЕЕ соединение между таблицами. Нет необходимости в условностях.
2. Согласен, что схема определенно «выключена». Если количество строк невелико и таблицы используются не везде, исправление структуры таблицы является обязательным.
Ответ №1:
Все, что вы хотите знать о предмете, и многое другое: Динамические условия поиска в T-SQL.
Ответ №2:
Вот как я бы это реализовал
http://www.sqlteam.com/article/implementing-a-dynamic-where-clause
И здесь очень хорошее объяснение http://sqlinthewild.co.za/index.php/2009/03/19/catch-all-queries /
Фил
Ответ №3:
Вы можете сделать это со статическим SQL с помощью хитрости ISNULL(product.color, 'n/a') = ISNULL(rate.color, ISNULL(product.color, 'n/a'))
.
Ответ №4:
Вы пробовали использовать внешнее соединение?
SELECT
P.*,
R.*
FROM
PRODUCT P LEFT OUTER JOIN RATE R
ON (P.product_ID = R.product_id AND (
P.COLOR = R.COLOR
OR P.SIZE = R.SIZE
))
WHERE
P.product_id = ?
Редактировать: Убрал предложение WHERE.