【发布时间】:2014-10-01 22:18:10
【问题描述】:
背景:
我编写的大多数脚本都会搜索缺少数据的记录。我使用 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
我必须欺骗它给我我想要的数据。我相信我已经想到了检索它的过程,但我只是不知道如何编码!
这是实际数据。注意:我不知道空白字段中有什么。约束是“NOT NULL”所以我相信那里有东西,我只是不知道它是什么!
这是我当前的代码:
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 不匹配:
请注意:如果我在 WHERE 子句中添加st.SARAATT_APPL_NO = sa.SARADAP_APPL_NO,它将跳过所有缺少数据的行! (我需要所有数据,以便清除不需要的数据)
这是我添加st.SARAATT_APPL_NO = sa.SARADAP_APPL_NO 时返回的数据。
为了检索我需要的数据,我想做这样的事情:
从当前 SELECT 语句中选择所有数据。
然后,对于每个 SARADAP_APPL_NO,在 SARAATT_APPL_NO 中找到它的匹配项。SELECT 那些没有匹配项的行,并在我为报告创建的列中打印“No WSP”(不在数据库)。
这就是我所说的“它有匹配吗?”:
或者我可以为某个 spriden_id 做某种SARADAP_APPL_NO not in (SARAATT_APPL_NO) 吗?
即3 4 not in (2 3 4 5)
如果任何 SARAATT_AAPL_NO 值 (2 3 4 5) 未包含在 SARADAP_APPL_NO 值 (3 4) 中,它将选择 SARAATT_APPL_NO 的 2 5 行并在我为报告制作的列中打印“No WSP”。
我匹配吗?相比?搜索?
这些是我想要的结果:
我可以做这样的事情并将其添加到代码中的某处吗?我想先选择数据,然后循环通过我选择的内容。
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
___________________________________________________________________________________
- 我正在使用两个主要表:SARADAP 和 SARAATT。 SARADAP 是实际的入学申请。 SARAATT 包含属性,并与应用程序具有公共字段(SARAATT/SARADAP _PIDM、SARAATT/SARADAP _TERM_CODE 和 SARAATT/SARADAP _APPL_NO)
- 第三张表是 SPRIDEN,包含此人的传记信息。我只需要该表中的 ID。
- 我的 SELECT 语句包含两个主表的 TERM_CODE 和 APPL_NO 列,但 WHERE 子句不包含使两个表中的 TERM_CODE 或 APPL_NO 匹配的条件。这意味着不是行是一致的(如下图所示),查询只是收集信息并将其放入打印输出中。
- 问题:如果我添加一个条件(
SARADAP_APPL_NO = st.SARAATT_APPL_NO和SARADAP_TERM_CODE = st.SARAATT_TERM_CODE),我真的需要的信息将不会被选中。 - 我真正需要的是让查询告诉我 SARAATT_ATTS_CODE 在哪里没有对应于 APPL_NO 或 TERM_CODE 的行。我无法获得该信息,因为 SARAATT_ATTS_CODE 在该行中没有“任何内容”,因此被查询忽略。它有一个 NOT NULL 约束,所以我不能简单地搜索 NULL 值。 (这是我试图通过
LOOP或其他方式解决的真正问题) - 由于查询不会返回我需要的结果(显示未填充 ATTS_CODE 的位置),因此我的工作思路是查看两个 APPL_NO 列并查找不在这两个列中的值。那些将是拥有未填充 SARAATT_ATTS_CODE 行的人。
这是数据库中的实际 DATA(但我添加了“我的列”只是为了显示我想要打印的内容
这些是我当前查询的结果
toddlermenot,您在 WITH 子句中询问了 Toddlerminot 查询的结果:
我按 SARADAP_APPL_NO 对结果进行了排序。请注意,红色的数据是混淆的。它不是真正应该在的位置,并且缺少 200810 和 201510 术语以及相应的应用程序编号(2 和 5)。这是当查询只是查找该表中存在的任何值(我相信它正在使用下一个可用值)并将其放置在该行中,因为该行中实际上没有任何内容 - 或者查询与 APPPL 不匹配数字和条款。
整个 Toddlerminot 查询的结果 我按 SARADAP_APPL_NO 对结果进行了排序。
我现在将尝试“创建一个小示例,例如在 sqlfiddle 中发布的 [Toddlerminot] 以说明 [我] 面临的问题。我会将其添加到我的问题中。
我在 Fiddle 中做到了。 sqlfiddle.com/#!4/f4d10/2 请注意,我为空白值输入了“”,因为存在非空约束。我认为它实际上是现在http://www.sqlfiddle.com/#!4/aa83f/1,因为我再次对其进行了编辑。我将数据类型更改为 Number(2,0) 并输入 0 而不是 ' '
这就是表格的样子,这是 Maria Smith 每个表格中的数据。
【问题讨论】:
-
根据您的帖子标题;你可以简单地像
select * from your_table where columna not in (select distinct columnb from your_table) -
@Rahul 感谢您的回复。我不确定你的意思。总共涉及4列。我要比较/匹配/搜索的两列是
st.SARAATT和sa.SARADAP。 -
@Rahul 我添加了
SA.SARADAP_APPL_NO not in (SELECT DISTINCT st.SARAATT_APPL_NO FROM SARAATT ST),但没有选择任何行。
标签: sql oracle search compare match