2014-10-01 95 views
0

背景
我写的大多数脚本搜索缺少数据的记录。我使用XXXX_APPL_NO(WHERE XXXX_APPL_NO = YYYY_APPL_NO)中的常用值来确保我选择的数据来自正确的行。
如果人员有多个应用程序,APPL_NO将有多行记录。
如果XXXX_APPL_NO不等于YYYY_APPL_NO(因为数据丢失),该脚本将忽略该行。所以我不能使用WHERE XXXX_APPL_NO = YYYY_APPL_NO
我必须把戏它把我想要的数据给我。我相信我已经想出了检索它的过程,但我不知道如何编写它!Oracle SQL - 比较列 - 对于不匹配的值的SELECT记录

这里是实际数据。注:我不知道什么是在空白的领域。约束是“NOT NULL”,所以我相信那里有东西,我只是不知道它是什么! Actual Data with Data Types and Constraints

这里是我当前的代码:

Select distinct 
sp.spriden_id as "ID", 
SP.SPRIDEN_LAST_NAME as "Last", 
SP.SPRIDEN_FIRST_NAME as "First", 
SA.SARADAP_TERM_CODE_ENTRY as "App Term", 
SA.SARADAP_ADMT_CODE as "Adm Type", 
st.SARAATT_TERM_CODE, 
st.SARAATT_APPL_NO, 
sa.SARADAP_APPL_NO 
/* I want to make a column in my report ONLY - NOT IN THE DATABASE - 
to print out "No WSP" if there is no corresponding SARAATT_APPL_NO 
for the SARADAP_APPL_NO */ 

FROM 
SPRIDEN SP 
JOIN SARADAP SA 
on sp.spriden_pidm = sa.saradap_PIDM 
JOIN SORLCUR SR 
on sp.spriden_pidm = SR.SORLCUR_PIDM 
full outer JOIN SARAATT ST 
on sp.spriden_pidm = ST.SARAATT_PIDM 

Where 
Sp.spriden_change_ind is null 
AND 
SA.SARADAP_ADMT_CODE in ('SP', 'XT') 

这是我当前的代码返回的数据。请注意,Term_Codes和Appl_Nos不匹配: Data - No app number match condition

请注意:如果我添加st.SARAATT_APPL_NO = sa.SARADAP_APPL_NO WHERE子句,它会跳过所有行与丢失的数据! (我需要所有的的数据,所以我可以除掉我不需要的)
这是返回的数据,如果我加st.SARAATT_APPL_NO = sa.SARADAP_APPL_NOData - with app number condition

为了找回我需要的数据,我想要做这样的事情:
从目前的SELECT语句选择所有的数据。
然后,对于每个SARADAP_APPL_NO,在SARAATT_APPL_NO中找到它的匹配项。
SELECT那些没有匹配的行,并在我为报表创建JUST(不在数据库中)的列中打印“No WSP”。
这是我的意思是什么“它有一个匹配?”: Does it have a match?

或者我可以做某种
SARADAP_APPL_NO not in (SARAATT_APPL_NO)一定spriden_id?
3 4 not in (2 3 4 5)
如果任何SARAATT_AAPL_NO值(2 3 4 5)的未在SARADAP_APPL_NO值(3 4)包括,将选择的行2 5 SARAATT_APPL_NO的和在一列中我使打印出“否WSP”为报告。

我是否匹配?比较?搜索?

这些是我想要的结果: Desired Results

我可以做这样的事情和地方在代码中添加呢?我想先选择数据然后通过我选择的循环。

DECLARE 
SARADAP_Count number() = 0; 
SARAATT_Count number() = 0; 

/* to keep going through the SARAATT_APPL_NO column until the end */ 
WHILE SA.SARADAP_APPL_NO not null 
    LOOP 
    /* If value being looked at in SARADAP = the value being looked at in SARAATT */ 
    IF SARADAP_APPL_NO = st.SARAATT_APPL_NO 
     /* Then add 1 to the count so we can compare the next value in SARADAP with the values in SARAATT*/ 
     THEN SARADAP_Count = SARADAP_Count + 1 
     /* Otherwise add 1 to the count to look at the next SARAATT value*/ 
     ELSE SARAATT_Count = SARAATT_Count + 1; 
     /* when we have compared all the values in SARAATT for one SARADAP value, and no  values matched, then print 'No WSP' in the "My Report Column" */ 
     WHEN SARADAP_APPL_NO <> st.SARAATT_APPL_NO THEN return 'NO WSP' in "MY REPORT COLUMN" 
     /* Now go to the next SARADAP row to compare that value with the values in SARAATT */ 
      LOOP 
      SARADAP_Count = SARADAP_Count +1 /* */ 
       END LOOP 
    END LOOP 

____________________________________________________________________________________

  1. 有我与工作两个主表:SARADAP和SARAATT。 SARADAP是实际的入场申请。 SARAATT包含属性并与应用程序具有共同的字段(SARAATT/SARADAP _PIDM,SARAATT/SARADAP _TERM_CODE和SARAATT/SARADAP _APPL_NO)
  2. 第三张表是SPRIDEN,包含该人员的个人信息。我只需要该表中的ID。
  3. 我的SELECT语句包括两个主表的TERM_CODE和APPL_NO列,但WHERE子句不包含任何使两个表中的TERM_CODE或APPL_NO匹配的条件。这意味着查询只是收集信息并将其放入打印输出中,而不是一致的(如下图所示)。
  4. 问题:如果我添加一个条件(SARADAP_APPL_NO = st.SARAATT_APPL_NOSARADAP_TERM_CODE = st.SARAATT_TERM_CODE),则不会选择需要的信息I
  5. 我真正需要的是查询告诉我SARAATT_ATTS_CODE在与APPL_NO或TERM_CODE对应的行中没有任何内容。我无法获取该信息,因为SARAATT_ATTS_CODE对于该行没有任何内容,因此被查询忽略。它有一个NOT NULL约束,所以我不能简单地搜索NULL值。 (这是我尝试通过执行LOOP或其他什么来解决的真正问题)
  6. 由于查询不会返回我需要的结果(显示ATTS_CODE未填充的位置),我的工作轮的想法是查看在两个APPL_NO列中查找不在两个列中的值。那些将有一个没有填充的SARAATT_ATTS_CODE行的人。
    这是实际的数据是在数据库中(但我已经添加了我的专栏只是为了显示我想打印 Data

这些是我目前的查询 Current Query Results的结果是什么

toddlermenot,你要的Toddlerminot查询中的结果与条款:
Results from WITH Clause 我按SARADAP_APPL_NO排序结果。请注意,红色数据会混淆在一起。这不是真的应该在哪里,200810和201510条款以及相应的应用程序编号(2和5)都不存在。这是当查询只查找该表中存在的任何值(我相信它正在使用下一个可用值)并将其放在该行中时,因为该行中实际上没有任何值 - 或者该查询与APPPL不匹配数字和条款。从Toddlerminot查询

结果作为一个整体 Results from Entire Toddlerminot Query 我通过SARADAP_APPL_NO排序的结果。

现在我将尝试以“创建像一个[Toddlerminot]张贴在sqlfiddle说明[我]面对的问题。我将它添加到我的问题的问题。

我做到了,在小提琴的小例子。sqlfiddle.com/#!4/f4d10/2请注意,由于存在非空限制,因此我将空白值填入''中。我认为现在实际上是http://www.sqlfiddle.com/#!4/aa83f/1,因为我再次编辑它。我将数据类型更改为数字(2,0),并输入0而不是“'

这就是表格的样子,这是每张表格中的数据。 Tables and Corresponding Data

+0

您的发布标题;你可以简单地做''select * from your_table where columna not in(select your distinct columnb from your_table)' – Rahul 2014-10-01 22:21:35

+0

@Rahul谢谢你的回复。我不确定你的意思。总共涉及4列。我想比较/匹配/搜索的两列是'st.SARAATT'和'sa.SARADAP'。 – 2014-10-01 22:29:29

+0

@Rahul我添加了'SA.SARADAP_APPL_NO不在(SELECT DISTINCT st.SARAATT_APPL_NO FROM SARAATT ST)',但没有选择行。 – 2014-10-01 22:34:34

回答

1

编辑3: 使用您发布的数据模型,我已经建造这样的:http://www.sqlfiddle.com/#!4/f1665/10

让我知道这是否为你。

几件事情:

  • 所有4行SPRIDEN是重复的。所以只保留一个。
  • 表SORLCUR无处使用,不在公布的截图中。所以从查询中删除它。
  • 在引用的屏幕截图中找不到任何引用的列。因此,他们从查询中扣除。
  • 突出显示的数据差异是由于在联接条件中省略TERM_CODE而导致的笛卡尔联接而引起的。
  • 报告栏按预期工作。

看起来你想要报告一个伪列。

如果我正确地分析你的问题,下面应该做的伎俩:

编辑:基于您的评论/编辑,我已经更新了查询:

编辑2: 这是仍然很难说没有整个数据模型,但如果我理解正确有2个问题:

1 - 红色突出显示的数据:我的猜测 - >这是因为使用FULL OUTER JOIN而不是LEFT OUTER JOIN。更新后的代码如下。试着让我知道。

2 - “我的报告列”显示为空白:还没有线索为什么这不起作用,您的SQL小提琴似乎显示它的工作。

WITH t AS 
(
    SELECT DISTINCT 
      SP.SPRIDEN_ID AS "ID", 
      SP.SPRIDEN_LAST_NAME AS "LAST", 
      SP.SPRIDEN_FIRST_NAME AS "FIRST", 
      SA.SARADAP_TERM_CODE_ENTRY AS "APP_TERM", 
      SA.SARADAP_ADMT_CODE AS "ADM_TYPE", 
      ST.SARAATT_TERM_CODE AS "TERM_CODE", 
      ST.SARAATT_APPL_NO "APPL_NO1", 
      SA.SARADAP_APPL_NO "APPL_NO2" 
    FROM 
     SPRIDEN SP 
     JOIN SARADAP SA 
     ON SP.SPRIDEN_PIDM = SA.SARADAP_PIDM 
     JOIN SORLCUR SR 
     ON SP.SPRIDEN_PIDM = SR.SORLCUR_PIDM 
     LEFT OUTER JOIN SARAATT ST 
     ON SP.SPRIDEN_PIDM = ST.SARAATT_PIDM 
    WHERE 
     SP.SPRIDEN_CHANGE_IND IS NULL 
     AND SA.SARADAP_ADMT_CODE IN ('SP', 'XT') 
) 
SELECT 
    ID, 
    LAST, 
    FIRST, 
    APP_TERM, 
    ADM_TYPE, 
    TERM_CODE, 
    APPL_NO1, 
    APPL_NO2, 
    CASE 
    WHEN (SELECT 
      COUNT(1) 
     FROM 
      t t2 
     WHERE 
      t1.APPL_NO2=t2.APPL_NO1) = 0 THEN 'NO WSP' 
    END AS "My Report Column" 
FROM 
    t t1; 

我还没有测试过这个语法错误,所以随时纠正它们。我确信有一个分析功能解决方案,但我认为这应该也是一样。

+0

感谢您的回答。直到明天我工作之前,我无法测试它。这是我需要的:查看ST.SARAATT_APPL_NO和SA.SARADAP_APPL_NO两列。查找行SARADAP_APPL_NO = 2和SARADAP_APPL_NO = 5在任何SARAATT_APPL_NO行中都没有匹配。拉出那些没有匹配的行。 明天我会测试这个。我希望你会回来。 :) – 2014-10-02 07:23:35

+0

@AuntieAnita:当然,请检查并让我知道。上面的查询不会过滤出具有SARAATT_APPL_NO = SARADAP_APPL_NO的记录。相反,它将显示具有“无WSP”值的所有记录(如您在问题中陈述的)和所需的记录(即SARADAP_APPL_NO <> SARAATT_APPL_NO),而其他记录对于“我的报告列”将具有NULL。 – toddlermenot 2014-10-02 07:33:44

+0

:(如果两列字面上不匹配,它将放弃没有WSP。它需要做到这一点:看第2列中的值,第1行(C2R1)是C1中的某个值?否,打印“无WSP”中的'我的报告栏' - C1中的C2R2否,打印否C1中的WSP-C2R3?是,不打印任何东西等等...... 因此,需要查看C2中的每个值,看它是否在C1然后决定是否打印“No WSP” – 2014-10-02 15:49:46

0

**感谢Todderlmenot(https://stackoverflow.com/users/350136/toddlermenot)的所有时间和精力!你帮助我解决了一半的问题,并在这个过程中学到了很多东西! 此外,感谢Vignesh Lakshmirajan帮助我解决另一半问题**

事实证明,我可以使用MINUS来确定列中缺少的行。

/* 
Author: 
Date: 30-Sep-14 
Purpose: Select records of Special or Transient applicants whose Attribute field (SAAADMS - Contacts, Cohorts, Attributes) does contain "WSP" 

NOTE: For those records missing the WSP, there will be no rows in SARAATT for the term/application number in which WPS is missing. 
Those rows will simply not exist. 

SARADAP_TERM SARADAP_APPL SARAATT_TERM SARAATT_APPL SARAATT_ATTS_CODE  
    200810   2    200810   2    WPS 
    200910   3      
    201080   4    201080   4    WPS 
    201350   5      

Use SARADAP MINUS SARAATT to retreive the rows for which there is no SARAATT. 
We can use this becuase for rows in which there is no WSP, there will also be no APPL_NO or TERM_CODE  
*/ 



Select 
sp.spriden_id as "ID", 
SP.SPRIDEN_LAST_NAME as "Last", 
SP.SPRIDEN_FIRST_NAME as "First", 
SA.SARADAP_TERM_CODE_ENTRY as "SARADAP_TERM_CODE_ENTRY", 
sa.SARADAP_APPL_NO as "SARADAP_APPL_NO" 

FROM  
SPRIDEN SP 
JOIN SARADAP SA 
on sp.spriden_pidm = sa.saradap_PIDM 

WHERE 
Sp.spriden_change_ind is null 
AND 
SA.SARADAP_TERM_CODE_ENTRY >= '201510' 
AND 
SA.SARADAP_ADMT_CODE in ('SP', 'XT') 


MINUS 


SELECT 
sp.spriden_id as "ID", 
SP.SPRIDEN_LAST_NAME as "Last", 
SP.SPRIDEN_FIRST_NAME as "First", 
st.SARAATT_TERM_CODE as "SARAATT_TERM_CODE", 
st.SARAATT_APPL_NO as "SARAATT_APPL_NO" 

FROM 
SPRIDEN SP 
LEFT OUTER JOIN SARAATT ST 
on sp.spriden_pidm = ST.SARAATT_PIDM 

WHERE 
Sp.spriden_change_ind is null