【发布时间】:2014-05-25 15:12:29
【问题描述】:
我需要检查 USICOAL 主数据库中的所有促销活动,但不在快照中(简单):
SELECT U.[PROMOTION_NO]
,U.[STORE_NO]
,U.[PROMOTION_NAME]
,U.[SCHED_BGN_DATETIME] AS 'USICOAL START_DATE'
,U.[SCHED_END_DATETIME] AS 'USICOAL END_DATE'
,S.[SCHED_BGN_DATETIME] AS 'SNAPSHOT START_DATE'
,S.[SCHED_END_DATETIME] AS 'SNAPSHOT END_DATE'
FROM [REWARDS_SNAPSHOT_2471].[dbo].[PROMOTION] AS S
FULL OUTER JOIN [USICOAL].[dbo].[PROMOTION] AS U
ON S.PROMOTION_NO = U.PROMOTION_NO
但是USICOAL 数据库没有显示正确的STORE_NO(即'8882'),而是将有一个随机数链接在一个单独的表(STORE_GROUP_STORE)上,所以我有以下查询:
SELECT UP.STORE_NO
,UP.PROMOTION_NO
FROM [USICOAL].[dbo].[PROMOTION] AS UP
LEFT JOIN [USICOAL].[dbo].[STORE_GROUP_STORE] AS US
ON UP.STORE_NO = US.STORE_GROUP_ID
WHERE US.STORE_NO = '8882'
以上两项都单独工作,但最重要的是包括不在下面查询中的商店('8882'),所以我尝试将它们链接在一起,查询似乎忽略了第二部分:
SELECT U.[PROMOTION_NO]
,U.[STORE_NO]
,U.[PROMOTION_NAME]
,U.[SCHED_BGN_DATETIME] AS 'USICOAL START_DATE'
,U.[SCHED_END_DATETIME] AS 'USICOAL END_DATE'
,S.[SCHED_BGN_DATETIME] AS 'SNAPSHOT START_DATE'
,S.[SCHED_END_DATETIME] AS 'SNAPSHOT END_DATE'
FROM [REWARDS_SNAPSHOT_2471].[dbo].[PROMOTION] AS S
FULL OUTER JOIN [USICOAL].[dbo].[PROMOTION] AS U
ON S.PROMOTION_NO = U.PROMOTION_NO
WHERE EXISTS
(SELECT UP.STORE_NO
,UP.PROMOTION_NO
FROM [USICOAL].[dbo].[PROMOTION] AS UP
LEFT JOIN [USICOAL].[dbo].[STORE_GROUP_STORE] AS US
ON UP.STORE_NO = US.STORE_GROUP_ID
WHERE US.STORE_NO = '8882')
AND S.PROMOTION_NO IS NULL
OR U.SCHED_BGN_DATETIME != S.SCHED_BGN_DATETIME
OR U.SCHED_END_DATETIME != S.SCHED_END_DATETIME
我知道上面很复杂,但是由于数据库结构我想不出如何简化它。
【问题讨论】:
标签: sql-server tsql join exists