Sql 筛选子查询结果
我在筛选查询中的重复值时遇到问题。这是我的问题Sql 筛选子查询结果,sql,oracle,subquery,Sql,Oracle,Subquery,我在筛选查询中的重复值时遇到问题。这是我的问题 SELECT cid.IDS_NO,cid.SUB_TITLE,cid.E_SUB_NAME, (cid.SUB_TITLE || ' '|| cid.E_SUB_NAME), (SELECT(INST_BLK_HSE || ' ' || (SELECT E_STREET_NAME FROM street_table where street_code = d.INST_ST_CODE)) FROM del d where d.IDS_NO =
SELECT cid.IDS_NO,cid.SUB_TITLE,cid.E_SUB_NAME, (cid.SUB_TITLE || ' '|| cid.E_SUB_NAME),
(SELECT(INST_BLK_HSE || ' ' || (SELECT E_STREET_NAME FROM street_table where street_code = d.INST_ST_CODE))
FROM del d where d.IDS_NO = cid.IDS_NO and ROWNUM = 1),
(SELECT INST_ST_LEVEL || '-' || INST_STUNIT FROM detail d where d.IDS_NO = cid.IDS_NO and rownum = 1),
('COUNTRY' ||' ' || pl_post),pl_post
FROM SUBSCRIBER cid where pl_postal_district = 15 and rownum < 3001
and hi_property_type IN ('CONDO','COMMERCIAL BUILDING');
这些部分总是得到多条记录,我只想得到一条序列号最低的记录,所以我做了以下工作:
(SELECT(INST_BLK_HSE || ' ' || (SELECT E_STREET_NAME FROM street_table where street_code = d.INST_ST_CODE))
FROM del d where d.IDS_NO = cid.IDS_NO and ROWNUM = 1 ORDER BY d.SEQ_NO DESC),
(SELECT INST_ST_LEVEL || '-' || INST_STUNIT FROM detail d where d.IDS_NO = cid.IDS_NO and rownum = 1 ORDER BY d.SEQ_NO DESC);
但是我总是会得到一个错误,说缺少括号,但是当我删除orderby时,它工作得很好。如何使查询正确运行?子查询只能返回一行。因此,必须将rownum=1添加到deld子查询中的子查询中。比如:
SELECT
cid.IDS_NO,
cid.SUB_TITLE,
cid.E_SUB_NAME,
(cid.SUB_TITLE || ' '|| cid.E_SUB_NAME),
(SELECT (INST_BLK_HSE || ' ' || (SELECT E_STREET_NAME
FROM street_table
where street_code = d.INST_ST_CODE
and rownum = 1)) <<<<<<< here
FROM del d
where d.IDS_NO = cid.IDS_NO
and ROWNUM = 1),
(SELECT INST_ST_LEVEL || '-' || INST_STUNIT
FROM detail d
where d.IDS_NO = cid.IDS_NO
and rownum = 1),
('COUNTRY' ||' ' || pl_post),
pl_post
FROM SUBSCRIBER cid
where pl_postal_district = 15
and rownum < 3001
and hi_property_type IN ('CONDO','COMMERCIAL BUILDING');
子查询只能返回一行。因此,必须将rownum=1添加到deld子查询中的子查询中。比如:
SELECT
cid.IDS_NO,
cid.SUB_TITLE,
cid.E_SUB_NAME,
(cid.SUB_TITLE || ' '|| cid.E_SUB_NAME),
(SELECT (INST_BLK_HSE || ' ' || (SELECT E_STREET_NAME
FROM street_table
where street_code = d.INST_ST_CODE
and rownum = 1)) <<<<<<< here
FROM del d
where d.IDS_NO = cid.IDS_NO
and ROWNUM = 1),
(SELECT INST_ST_LEVEL || '-' || INST_STUNIT
FROM detail d
where d.IDS_NO = cid.IDS_NO
and rownum = 1),
('COUNTRY' ||' ' || pl_post),
pl_post
FROM SUBSCRIBER cid
where pl_postal_district = 15
and rownum < 3001
and hi_property_type IN ('CONDO','COMMERCIAL BUILDING');
格式化查询以使其更易于阅读,这在一开始就有很大的帮助 但是你也有一个相当棘手的问题,因为你 希望仅获取序列号最低的1条记录 应该这样做:
SELECT
cid.IDS_NO,
cid.SUB_TITLE,
cid.E_SUB_NAME,
cid.SUB_TITLE || ' '|| cid.E_SUB_NAME,
d.INST_BLK_HSE || ' ' || s.E_STREET_NAME,
d.INST_ST_LEVEL || '-' || d.INST_STUNIT
'COUNTRY' ||' ' || pl_post),
pl_post
FROM SUBSCRIBER cid
INNER JOIN del d ON d.IDS_NO = cid.IDS_NO
INNER JOIN detail d2 ON d2.IDS_NO = cid.IDS_NO
INNER JOIN street_table s ON s.street_code = d.INST_ST_CODE
WHERE cid.pl_postal_district = 15
and cid.rownum < 3001
and cid.hi_property_type IN ('CONDO','COMMERCIAL BUILDING')
and s.rownum = 1
and d.rownum = 1
and d2.rownum = 1;
SELECT s.ids_no
,s.sub_title
,s.e_sub_name
,(s.sub_title || ' '|| s.e_sub_name) AS title_sub_name
,d.some_col_name
,t.inst_name
,('COUNTRY' ||' ' || s.pl_post) AS country_post
,s.pl_post
FROM subscriber s
LEFT JOIN (
SELECT d.ids_no
,(d.inst_blk_hse || ' ' || st.e_street_name) AS some_col_name
,ROW_NUMBER() OVER (PARTITION BY d.ids_no ORDER BY d.seq_no) AS rn
FROM del d
LEFT JOIN e_street_name st ON st.street_code = d.inst_st_code
) d ON d.ids_no = s.ids_no AND d.rn = 1
LEFT JOIN (
SELECT ids_no
,(inst_st_level || '-' || inst_stunit) AS inst_name
,ROW_NUMBER() OVER (PARTITION BY d.ids_no ORDER BY d.seq_no) AS rn
FROM detail
) t ON t.ids_no = s.ids_no AND t.rn = 1
WHERE s.pl_postal_district = 15
AND s.rownum < 3001
AND s.hi_property_type IN ('CONDO','COMMERCIAL BUILDING');
有关此相关问题下子查询如何工作的更多详细信息:
其核心功能是获取序列号最低的记录的行号。
我重写了相关子查询,因为它们在性能方面通常很糟糕。它们也很难阅读。
我使用LEFT JOIN,因此您仍然可以得到一行,以防子查询找不到任何匹配项。格式化您的查询以使其更易于阅读 但是你也有一个相当棘手的问题,因为你 希望仅获取序列号最低的1条记录 应该这样做:
SELECT
cid.IDS_NO,
cid.SUB_TITLE,
cid.E_SUB_NAME,
cid.SUB_TITLE || ' '|| cid.E_SUB_NAME,
d.INST_BLK_HSE || ' ' || s.E_STREET_NAME,
d.INST_ST_LEVEL || '-' || d.INST_STUNIT
'COUNTRY' ||' ' || pl_post),
pl_post
FROM SUBSCRIBER cid
INNER JOIN del d ON d.IDS_NO = cid.IDS_NO
INNER JOIN detail d2 ON d2.IDS_NO = cid.IDS_NO
INNER JOIN street_table s ON s.street_code = d.INST_ST_CODE
WHERE cid.pl_postal_district = 15
and cid.rownum < 3001
and cid.hi_property_type IN ('CONDO','COMMERCIAL BUILDING')
and s.rownum = 1
and d.rownum = 1
and d2.rownum = 1;
SELECT s.ids_no
,s.sub_title
,s.e_sub_name
,(s.sub_title || ' '|| s.e_sub_name) AS title_sub_name
,d.some_col_name
,t.inst_name
,('COUNTRY' ||' ' || s.pl_post) AS country_post
,s.pl_post
FROM subscriber s
LEFT JOIN (
SELECT d.ids_no
,(d.inst_blk_hse || ' ' || st.e_street_name) AS some_col_name
,ROW_NUMBER() OVER (PARTITION BY d.ids_no ORDER BY d.seq_no) AS rn
FROM del d
LEFT JOIN e_street_name st ON st.street_code = d.inst_st_code
) d ON d.ids_no = s.ids_no AND d.rn = 1
LEFT JOIN (
SELECT ids_no
,(inst_st_level || '-' || inst_stunit) AS inst_name
,ROW_NUMBER() OVER (PARTITION BY d.ids_no ORDER BY d.seq_no) AS rn
FROM detail
) t ON t.ids_no = s.ids_no AND t.rn = 1
WHERE s.pl_postal_district = 15
AND s.rownum < 3001
AND s.hi_property_type IN ('CONDO','COMMERCIAL BUILDING');
有关此相关问题下子查询如何工作的更多详细信息:
其核心功能是获取序列号最低的记录的行号。
我重写了相关子查询,因为它们在性能方面通常很糟糕。它们也很难阅读。
我使用LEFT JOIN,因此您仍然可以得到一行,以防子查询找不到任何匹配项。也许这篇文章可以帮助我,也许这篇文章可以帮助我尝试查询,但是它仍然有错误。但你确实给了我一个使用过分区的想法。谢谢,顺便说一句,如果我的查询非常混乱,那么很抱歉,因为我对SQL还是很陌生的。再次感谢。@marchemike:太好了修复了一些表别名。我尝试了查询,但仍然有错误。但你确实给了我一个使用过分区的想法。谢谢,顺便说一句,如果我的查询非常混乱,那么很抱歉,因为我对SQL还是很陌生的。再次感谢。@marchemike:太好了修复了一些表别名。