2013-08-06 37 views
0

我有一个116个不同的代理到顶点/地理组合的列表,我必须确保它们配对在一起。例如,这里是我的116列表中的一小部分。执行多个WHERE语句的一个大查询

AGNT Vertex/Geo 
5040 440292570 
2010 440390000 
1010 440390060 
1180 440390246 
1800 440390570 
1130 440391110 
1830 440391680 
1410 440395020 
1060 440397460 
2000 440399685 
1460 440399687 
2020 440710000 
1030 440710210 

我一直在使用这个查询来检查每一对1乘1。换句话说,我必须不断更改agnt_hse和VRTX_GEOCODE_HSE来检查每一对是否正确。

USE ExternalUser 

SELECT distinct HSE_KEY_HSE AS HOUSE_KEY, AGNT_HSE AS AGENT, VRTX_GEOCODE_HSE as GEOCODE 

FROM  ExternalUser.Vantage.HSE_BASE 
     INNER JOIN externaluser.Vantage.HSL_LOB ON HSE_KEY_HSE = HSE_KEY_HSL 
     LEFT JOIN externaluser.Vantage.HSM_MEMO ON HSE_KEY_HSE = HSE_KEY_HSM 

WHERE MEMO_NO_HSM = 1 
And sys_hsl = '8777' 
And sys_hsm = '8777' 
And delivery_segment_id_hsl = 'C' 
And agnt_hse in ('5040') and VRTX_GEOCODE_HSE != '440292570' 

有没有办法一次运行多个查询?

我熟悉UNION命令,但觉得可能有一种方法来压缩编码,因为如果我被强制使用UNION命令,我会粘贴100x以上的大型查询。

我想沿着

WHERE MEMO_NO_HSM = 1 
And sys_hsl = '8777' 
And sys_hsm = '8777' 
And delivery_segment_id_hsl = 'C' 
And agnt_hse in ('5040') and VRTX_GEOCODE_HSE != '440292570' 
Then agnt_hse in ('2010') and VRTX_GEOCODE_HSE != '440390000' 
Then agnt_hse in ('1010') and VRTX_GEOCODE_HSE != '440390060' 
...etc 

也许我会对此完全错误的东西线和那里有不同的方式来运行查询? 任何信息非常感谢。

回答

0

它看起来像你正试图获得例外,你正在提供的列表。也就是说,所有匹配代理的行都有不同的顶点。

我会为列表使用明确的辅助表格(如果可能的话)或使用CTE构造一个表格。这里是CTE版本:

with pairs as (
     select '5040' as agent, '440292570' as vertex union all 
     select '2010', '440390000' 
     . . . 
    ) 
SELECT distinct HSE_KEY_HSE AS HOUSE_KEY, AGNT_HSE AS AGENT, VRTX_GEOCODE_HSE as GEOCODE 
FROM ExternalUser.Vantage.HSE_BASE INNER JOIN 
     externaluser.Vantage.HSL_LOB 
     ON HSE_KEY_HSE = HSE_KEY_HSL LEFT JOIN 
     externaluser.Vantage.HSM_MEMO 
     ON HSE_KEY_HSE = HSE_KEY_HSM join 
     pairs p 
     on p.agent = agnt_hse 
WHERE MEMO_NO_HSM = 1 And 
     sys_hsl = '8777' And 
     sys_hsm = '8777' And 
     delivery_segment_id_hsl = 'C' and 
     (p.Vertex <> VRTX_GEOCODE_HSE) 
+0

谢谢@Gordon的回复。是的,我试图找出代理不匹配其顶点的情况。我想更多的对添加到这样的代码 '与对作为( 选择“5040”作为代理人,“440292570”为顶点UNION ALL 选择“2010”,“440390000” \t选择“1010”,' 440390060' \t) SELECT distinct distinct HSE_KEY_HSE AS HOUSE_KEY,AGNT_HSE AS AGENT,' – LLL

+0

@LLL。 。 。在每个“select”前面都需要一个'union all'(第一个除外)。 –

0

你没有指定你的rbdms,所以我将给出一个通用的例子。该原则应该适用于大多数数据库引擎,但您可能需要更改语法。我也假设agnt_hse和vertx_geocode_hse是整数。如果这种假设是错误的,则所需的改变应该是显而易见的。

select yourfields 
from yourtables 
where concat(to_char(agnt_hse), to_char(vertx_geocode_hse)) in 
(select concat(to_char(agnt_hse), to_char(vertx_geocode_hse)) 
from TheTablesYouAreLookingAt 
minus 
select concat(to_char(agnt_hse), to_char(vertx_geocode_hse)) 
from TheTablesWithTheCorrectData) 
相关问题