Необязательное предложение where

#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.