Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何根据条件创建select语句的问题_Sql_Sql Server 2008_Tsql - Fatal编程技术网

Sql 如何根据条件创建select语句的问题

Sql 如何根据条件创建select语句的问题,sql,sql-server-2008,tsql,Sql,Sql Server 2008,Tsql,针对以下基于条件创建select语句(SQL SERVER)的问题,我想了解一些关于应该考虑哪些选项的说明: 注:简化实际问题 如果我有两个表,每个表都有一个我需要使用的字段 例如: CUSTOMER.CUSTOMER_ID PRODUCT.PRODUCT_ID 我还有另外两个表,它们包含基于这两个字段的特殊产品定价 例如: 对于每个CUSTOMER.CUSTOMER\u ID和PRODUCT.PRODUCT\u ID,我希望使用左外部联接来联接CUSTOMER\u定价和MARKET\u定价记

针对以下基于条件创建select语句(SQL SERVER)的问题,我想了解一些关于应该考虑哪些选项的说明:

注:简化实际问题

如果我有两个表,每个表都有一个我需要使用的字段 例如:

CUSTOMER.CUSTOMER_ID
PRODUCT.PRODUCT_ID
我还有另外两个表,它们包含基于这两个字段的特殊产品定价 例如:

对于每个CUSTOMER.CUSTOMER\u ID和PRODUCT.PRODUCT\u ID,我希望使用左外部联接来联接CUSTOMER\u定价和MARKET\u定价记录。但条件只有在

A) 价格字段不为空

B) 如果两者都存在客户ID/产品ID,我只需要客户价格的记录

比如:

IF EXISTS (SELECT C.CUSTOMER_ID, P.PRODUCT_ID FROM CUSTOMER C, PRODUCT P 
           WHERE C.CUSTOMER_ID, P.PRODUCT_ID IN 
           (SELECT PRICE FROM CUSTOMER_PRICE WHERE PRICE IS NOT NULL))
ELSE IF EXISTS 
          (SELECT C.CUSTOMER_ID, P.PRODUCT_ID FROM CUSTOMER C, PRODUCT P 
           WHERE C.CUSTOMER_ID, P.PRODUCT_ID IN 
           (SELECT PRICE FROM MARKET_PRICE WHERE PRICE IS NOT NULL))
***然后以某种方式对这些结果进行连接


有什么建议吗?

如果您使用的是ORACLE,您应该使用union来消除重复的行,并进行两个单独的查询。

我想我已经想出了一个解决方案。我相信SQL专家可以想出更好的方法,但这应该会让您有所行动:

WITH CTE AS
(
    SELECT C.CUSTOMER_ID, C.PRODUCT_ID, C.CUSTOMER_PRICE as [PRICE], 1 as [T]
    FROM CUSTOMER_PRICE C WHERE C.CUSTOMER_PRICE IS NOT NULL
    UNION
    SELECT P.CUSTOMER_ID, P.PRODUCT_ID,P.MARKET_PRICE as [PRICE], 2 as [T]
    FROM MARKET_PRICE P WHERE P.MARKET_PRICE IS NOT NULL
)
select CUSTOMER_ID,PRODUCT_ID,
    (
        SELECT TOP (1) PRICE FROM CTE i WHERE i.CUSTOMER_ID = o.CUSTOMER_ID AND i.PRODUCT_ID = o.PRODUCT_ID
        ORDER BY T
    ) as [PRICE]
from CTE o
GROUP BY CUSTOMER_ID,PRODUCT_ID
这将为您提供一个清晰的客户ID、产品ID和价格列表;优惠
客户价格
价格

编辑 这仅适用于SQL databases 2008及更高版本。它利用了2008年的新结构

更新
修正了where子句。

您可以将
客户
产品
的叉积与
客户定价
市场定价
合并,过滤掉
客户定价.价格
市场定价.价格
均为空的行。它可能看起来像这样:

SELECT
  c.CUSTOMER_ID,
  p.PRODUCT_ID,
  COALESCE(cp.PRICE, mp.PRICE) AS PRICE
FROM CUSTOMER c
  CROSS JOIN PRODUCT p
  LEFT JOIN CUSTOMER_PRICING cp ON cp.CUSTOMER_ID = c.CUSTOMER_ID AND cp.PRODUCT_ID = p.PRODUCT_ID
  LEFT JOIN MARKET_PRICING   mp ON mp.CUSTOMER_ID = c.CUSTOMER_ID AND mp.PRODUCT_ID = p.PRODUCT_ID
WHERE cp.PRICE IS NOT NULL OR mp.PRICE IS NOT NULL
-- Or, put differently:
-- WHERE NOT (cp.PRICE IS NULL AND mp.PRICE IS NULL)
创建一个名为CMPricing的视图将大大简化这种情况。
CREATE view CMPricing
AS
挑选 t1.客户识别码, t1.产品标识, t1.作为客户价格的价格 t2.价格与市场价格一致
来自客户定价t1 内部联接市场定价t2 在t1.CUSTOMER\u ID=t2.CUSTOMER\u ID上 t1.PRODUCT_ID=t2.PRODUCT_ID
其中t1.PRICE不为空 并且t2.PRICE不为空
然后查询此视图以获得所需内容


此视图将仅包含两个“价格”表之间共用的数据,其中两个“价格”值均不为空。该视图本质上为您进行过滤,从而使您对其他数据表的查询更容易执行和理解。

您计划加入哪个字段?还有其他列没有显示吗?我计划加入PRODUCT_ID和CUSTOMER_ID字段。实际上,只需要CUSTOMER\u ID、PRODUCT\u ID和PRICE字段。您实际上是想从这两个表中获取
PRODUCT\u ID
CUSTOMER\u ID
、和
PRICE
字段作为一个结果,只要价格不为
NULL
?@Zero21xxx-是,如果两个表中都存在相同的客户id/产品id记录,则客户定价优先于市场定价。这两个表中的同一对
(客户id,产品id)
是否可以有多个价格?我的意思是,我知道两张表中可能都有相同的一对。我的问题是它是否可以在一个表(两个表中的任何一个)中出现多次。更新的问题-使用SQL Server 2008
SELECT
  c.CUSTOMER_ID,
  p.PRODUCT_ID,
  COALESCE(cp.PRICE, mp.PRICE) AS PRICE
FROM CUSTOMER c
  CROSS JOIN PRODUCT p
  LEFT JOIN CUSTOMER_PRICING cp ON cp.CUSTOMER_ID = c.CUSTOMER_ID AND cp.PRODUCT_ID = p.PRODUCT_ID
  LEFT JOIN MARKET_PRICING   mp ON mp.CUSTOMER_ID = c.CUSTOMER_ID AND mp.PRODUCT_ID = p.PRODUCT_ID
WHERE cp.PRICE IS NOT NULL OR mp.PRICE IS NOT NULL
-- Or, put differently:
-- WHERE NOT (cp.PRICE IS NULL AND mp.PRICE IS NULL)
CREATE VIEW CMPricing AS
SELECT t1.CUSTOMER_ID, t1.PRODUCT_ID, t1.PRICE AS CUSTOMER_PRICE t2.PRICE AS MARKET_PRICE
FROM CUSTOMER_PRICING t1 INNER JOIN MARKET_PRICING t2 ON t1.CUSTOMER_ID = t2.CUSTOMER_ID AND t1.PRODUCT_ID = t2.PRODUCT_ID
WHERE t1.PRICE IS NOT NULL AND t2.PRICE IS NOT NULL