【问题标题】:Optional where clause可选的 where 子句
【发布时间】:2011-05-11 17:57:04
【问题描述】:

我有两张桌子

表 A - 产品信息 - 颜色、尺寸等...(product_id, color, size...)

表 B - 费率信息 - 费率可能因颜色、尺寸、状态等而异... (rate_id, product_id, color, size, state, rate)

并非所有产品的费率都因颜色、尺寸、状态等而异......这因产品而异

如果是这种情况,则只有费率变化的属性在费率表中具有值 例如如果产品 X 费率不因尺寸或状态而异,但因颜色而异,则费率表中的条目将具有不同的颜色值,但尺寸、状态字段将为空。

SQL 中有没有一种方法可以为产品获取正确的费率值 - 我无法匹配所有产品属性,因为可能没有匹配的行

我想要的是一个查询,它可以获取与产品 X 相关的费率,并将与其他产品一起使用,这些产品的费率可能因不同的属性集而异。

【问题讨论】:

  • 我认为你最好让架构更简单。表 A 不应包含颜色或尺寸信息。表 B 应始终包含给定 product_id 的一行或多行。您总是在表之间进行内部联接。不需要条件。
  • 同意架构绝对是“关闭”的。如果行数很少,而且表不是到处使用,那么修复表结构是必须的。

标签: sql sql-server


【解决方案1】:

您想了解的有关该主题的所有信息,以及更多信息:Dynamic Search Conditions in T-SQL

【讨论】:

    【解决方案2】:

    【讨论】:

      【解决方案3】:

      您可以使用技巧ISNULL(product.color, 'n/a') = ISNULL(rate.color, ISNULL(product.color, 'n/a')) 使用静态 SQL 来做到这一点。

      【讨论】:

        【解决方案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 子句。

        【讨论】:

          猜你喜欢
          • 2018-04-01
          • 2013-10-12
          • 1970-01-01
          • 1970-01-01
          • 2012-04-28
          • 2012-05-05
          • 1970-01-01
          • 1970-01-01
          • 2022-08-14
          相关资源
          最近更新 更多