Sql 如何根据条件创建select语句的问题
针对以下基于条件创建select语句(SQL SERVER)的问题,我想了解一些关于应该考虑哪些选项的说明: 注:简化实际问题 如果我有两个表,每个表都有一个我需要使用的字段 例如: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定价记
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
ASSELECT 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