我一直在四处寻找并且还没有找到如何做到这一点(虽然已经发现很多关于分析它的性能?!)
我想执行一个返回几列数据的select,然后是另一个表中相关行的嵌套表(实际上是同一个表连接在一起,但我认为'这是相关的).
所以数据是这样的:
id name registered
1 Dan N
2 Bill N
3 Bob N
4 Dan N
5 Bill Y
6 Dan Y
Run Code Online (Sandbox Code Playgroud)
该想法是执行选择,该选择找到可能与注册帐户相关的所有未注册人.
所以结果看起来像
registered.id name notreg.id name
5 Bill 2 Bill
6 Dan 1 Dan
4 Dan
Run Code Online (Sandbox Code Playgroud)
我没关系,SQL可以处理所有的选择标准等,并且有一个查询返回一个正常的内连接,找到这个,但想知道是否有可能得到这样的结果集,所以左边没有重复的值侧??
您可能最好在客户端中禁止重复它(例如在Jasper Reports中取消选中Print Repeated Value或在XML集中isPrintRepeatedValues="false")
但是在任何支持WITH和ROW_NUMBER()(例如Oracle,SQL Server 2005+).
WITH ns
AS (SELECT Row_number() OVER (PARTITION BY name ORDER BY id) rn,
id,
name,
registered
FROM t
WHERE registered = 'N')
SELECT t.id,
t.name,
ns.id,
ns.name
FROM ns
LEFT JOIN t
ON ns.name = t.name
AND t.registered = 'Y'
AND ns.rn = 1
WHERE ns.name IN (SELECT name
FROM t
WHERE registered = 'Y')
ORDER BY ns.name
Run Code Online (Sandbox Code Playgroud)
如果您没有WITH和ROW_NUIMBER,则可以执行此操作
SELECT t.id,
t.name,
ns.id,
ns.name
FROM t ns
LEFT JOIN (SELECT MIN(id) id,
name
FROM t
WHERE registered = 'N'
GROUP BY name) MINNS
ON ns.id = MINNS.id
LEFT JOIN t
ON ns.name = t.name
AND t.registered = 'Y'
AND MINNS.id IS NOT NULL
WHERE ns.registered = 'N'
AND ns.name IN (SELECT name
FROM t
WHERE registered = 'Y')
ORDER BY ns.name,
ns.id
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9825 次 |
| 最近记录: |