我已经四处寻找了一下,但还没有找到如何做到这一点(尽管已经找到了很多关于分析其性能的信息?!)
我想执行一个选择,返回几列数据,然后还返回另一个表中相关行的嵌套表(实际上是同一个表本身连接,但我“认为”这是不相关的)。
所以数据是这样的:
id name registered
1 Dan N
2 Bill N
3 Bob N
4 Dan N
5 Bill Y
6 Dan Y
这个想法是执行一个选择,找到所有可能与注册帐户相关的未注册人员。
所以结果看起来像这样
registered.id name notreg.id name
5 Bill 2 Bill
6 Dan 1 Dan
4 Dan
我可以使用 SQL 处理所有选择条件等,并且有一个查询返回找到此内容的正常内部联接,但想知道是否有可能获得类似这样的结果集,因此在左边??
您最好在客户端中抑制重复项(例如在 Jasper Reports 中取消选中
Print Repeated Value
或在 XML 集中isPrintRepeatedValues="false"
)
但是,在任何支持
WITH
(CTE) 和 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
如果您没有WITH和ROW_NUMBER,您可以这样做
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