基本 Select 不同的问题
Basic Select Distinct issue
嗨,我有这样的数据:
otord# otusrn ottrnc ojhttn$ ottrnd
----------------------------------------------------------------------
123 Joe AAA 100.00 07/17/15
123 Joe BBB 100.00 07/16/15
我做了这个 select:我真的想 select 只在订单 # 和 amt 上区分。但我还想展示属于该独特部分的 otusrn 和代码。所以我想要 123 和 100$ 作为唯一值,但 'tag along' 其他列是这将做什么?
SELECT DISTINCT otord#,
ohttn$,
ottrnd
FROM replib.clspaytpl
WHERE otusrn IN ('ANDON', 'SCH', 'JRU', 'BERT', 'TRA', 'LINA')
AND ottrnd >= 20140701
您的问题是您没有指定要对 "tag along" 列执行的操作,因为它们不是唯一的,您可能对同一条记录有很多结果。您要么必须将它们包含在不同的子句中,要么采用许多可能的记录之一。
如果您真的不关心 "tag along" 列的值,您可以对它们使用 max() 以 return 只有最大值,但请记住,您会丢失数据当它们不同时。所以像 :
SELECT otord#, max(otusrn), max(ottrnc), ojhttn$, max(ottrnd)
FROM replib.clspaytpl
WHERE otusrn IN ('ANDON', 'SCH', 'JRU', 'BERT', 'TRA', 'LINA')
AND ottrnd >= 20140701
group by otord#, ojhttn$
要仅检索与 header 记录连接的组中的第一条详细记录,您可以使用类似这样的语法:
WITH head (otord#, ojhttn$) as (
SELECT DISTINCT otord#, ojhttn$
FROM replib.clspaytpl
WHERE otusrn in ('ANDON','SCH','JRU','BERT','TRA','LINA')
AND ottrnd >= 20140701)
SELECT h.otord#, h.ojhttn$, d.otusrn, d.ottrnc, d.ottrnd
FROM head h,
TABLE (SELECT *
FROM replib.clspaytpl
WHERE otord# = h.otord#
AND ojhttn$ = h.ojhttn$
AND otusrn in ('ANDON','SCH','JRU','BERT','TRA','LINA)
AND ottrnd >= 20140701
FETCH FIRST ROW ONLY) d
如果您有一个真正的 header 文件,每个 order/amount 只包含一条记录,您可以使用它来代替 CTE(通用 Table 表达式)。
嗨,我有这样的数据:
otord# otusrn ottrnc ojhttn$ ottrnd
----------------------------------------------------------------------
123 Joe AAA 100.00 07/17/15
123 Joe BBB 100.00 07/16/15
我做了这个 select:我真的想 select 只在订单 # 和 amt 上区分。但我还想展示属于该独特部分的 otusrn 和代码。所以我想要 123 和 100$ 作为唯一值,但 'tag along' 其他列是这将做什么?
SELECT DISTINCT otord#,
ohttn$,
ottrnd
FROM replib.clspaytpl
WHERE otusrn IN ('ANDON', 'SCH', 'JRU', 'BERT', 'TRA', 'LINA')
AND ottrnd >= 20140701
您的问题是您没有指定要对 "tag along" 列执行的操作,因为它们不是唯一的,您可能对同一条记录有很多结果。您要么必须将它们包含在不同的子句中,要么采用许多可能的记录之一。
如果您真的不关心 "tag along" 列的值,您可以对它们使用 max() 以 return 只有最大值,但请记住,您会丢失数据当它们不同时。所以像 :
SELECT otord#, max(otusrn), max(ottrnc), ojhttn$, max(ottrnd)
FROM replib.clspaytpl
WHERE otusrn IN ('ANDON', 'SCH', 'JRU', 'BERT', 'TRA', 'LINA')
AND ottrnd >= 20140701
group by otord#, ojhttn$
要仅检索与 header 记录连接的组中的第一条详细记录,您可以使用类似这样的语法:
WITH head (otord#, ojhttn$) as (
SELECT DISTINCT otord#, ojhttn$
FROM replib.clspaytpl
WHERE otusrn in ('ANDON','SCH','JRU','BERT','TRA','LINA')
AND ottrnd >= 20140701)
SELECT h.otord#, h.ojhttn$, d.otusrn, d.ottrnc, d.ottrnd
FROM head h,
TABLE (SELECT *
FROM replib.clspaytpl
WHERE otord# = h.otord#
AND ojhttn$ = h.ojhttn$
AND otusrn in ('ANDON','SCH','JRU','BERT','TRA','LINA)
AND ottrnd >= 20140701
FETCH FIRST ROW ONLY) d
如果您有一个真正的 header 文件,每个 order/amount 只包含一条记录,您可以使用它来代替 CTE(通用 Table 表达式)。