我一直在四处寻找,但还没有找到如何执行此操作的方法(尽管在分析其性能方面发现了很多内容!!)
我想执行一次选择,该操作返回几列数据,然后返回另一个表中的相关行的嵌套表(实际上是同一张表本身连接在一起,但我认为这是无关紧要的)。
所以数据是这样的:
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 set中isPrintRepeatedValues="false")
Print Repeated Value
isPrintRepeatedValues="false"
但是在任何支持WITH和的东西上ROW_NUMBER()(例如Oracle,SQL Server 2005+)。
WITH
ROW_NUMBER()
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_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