- 修复 Oracle AsTable 分表嵌套 SQL 拼错错误;#1098

This commit is contained in:
2881099 2022-05-12 13:36:19 +08:00
parent 1b84a00696
commit a3a3d56ec3
9 changed files with 157 additions and 133 deletions

View File

@ -131,7 +131,7 @@ namespace base_entity
public string ShippingAddress { get; set; } public string ShippingAddress { get; set; }
} }
[Table(Name = "tb_TopicMapTypeToListDto")] [Table(Name = "tb_tmttld"), OraclePrimaryKeyName("TMTTLD_PK01")]
class TopicMapTypeToListDto class TopicMapTypeToListDto
{ {
[Column(IsIdentity = true, IsPrimary = true)] [Column(IsIdentity = true, IsPrimary = true)]
@ -185,8 +185,8 @@ namespace base_entity
.UseConnectionString(FreeSql.DataType.PostgreSQL, "Host=192.168.164.10;Port=5432;Username=postgres;Password=123456;Database=tedb;Pooling=true;Maximum Pool Size=2") .UseConnectionString(FreeSql.DataType.PostgreSQL, "Host=192.168.164.10;Port=5432;Username=postgres;Password=123456;Database=tedb;Pooling=true;Maximum Pool Size=2")
.UseNameConvert(FreeSql.Internal.NameConvertType.ToLower) .UseNameConvert(FreeSql.Internal.NameConvertType.ToLower)
//.UseConnectionString(FreeSql.DataType.Oracle, "user id=user1;password=123456;data source=//127.0.0.1:1521/XE;Pooling=true;Max Pool Size=2") .UseConnectionString(FreeSql.DataType.Oracle, "user id=user1;password=123456;data source=//127.0.0.1:1521/XE;Pooling=true;Max Pool Size=2")
//.UseNameConvert(FreeSql.Internal.NameConvertType.ToUpper) .UseNameConvert(FreeSql.Internal.NameConvertType.ToUpper)
//.UseConnectionString(FreeSql.DataType.OdbcMySql, "Driver={MySQL ODBC 8.0 Unicode Driver};Server=127.0.0.1;Persist Security Info=False;Trusted_Connection=Yes;UID=root;PWD=root;DATABASE=cccddd_odbc;Charset=utf8;SslMode=none;Max pool size=2") //.UseConnectionString(FreeSql.DataType.OdbcMySql, "Driver={MySQL ODBC 8.0 Unicode Driver};Server=127.0.0.1;Persist Security Info=False;Trusted_Connection=Yes;UID=root;PWD=root;DATABASE=cccddd_odbc;Charset=utf8;SslMode=none;Max pool size=2")
@ -452,6 +452,10 @@ namespace base_entity
var sqls501 = sqls5.ToSql(); var sqls501 = sqls5.ToSql();
var sqls502 = sqls5.ToList(); var sqls502 = sqls5.ToList();
var sqls6 = fsql.Select<AsTableLog>().Where(a => a.createtime < DateTime.Parse("2022-5-1")).Limit(10).OrderBy(a => a.createtime);
var sqls601 = sqls6.ToSql();
var sqls602 = sqls6.ToList();
fsql.Aop.AuditValue += new EventHandler<FreeSql.Aop.AuditValueEventArgs>((_, e) => fsql.Aop.AuditValue += new EventHandler<FreeSql.Aop.AuditValueEventArgs>((_, e) =>
{ {

View File

@ -22,40 +22,40 @@ namespace FreeSql.Dameng.Curd
tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter, true); tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter, true);
var sb = new StringBuilder(); var sb = new StringBuilder();
var sbunion = new StringBuilder();
var sbnav = new StringBuilder();
var tbUnionsGt0 = tbUnions.Count > 1; var tbUnionsGt0 = tbUnions.Count > 1;
for (var tbUnionsIdx = 0; tbUnionsIdx < tbUnions.Count; tbUnionsIdx++) for (var tbUnionsIdx = 0; tbUnionsIdx < tbUnions.Count; tbUnionsIdx++)
{ {
if (tbUnionsIdx > 0) sb.Append("\r\n \r\nUNION ALL\r\n \r\n"); if (tbUnionsIdx > 0) sb.Append("\r\n \r\nUNION ALL\r\n \r\n");
if (tbUnionsGt0) sb.Append(_select).Append(" * from (");
var tbUnion = tbUnions[tbUnionsIdx]; var tbUnion = tbUnions[tbUnionsIdx];
var sbnav = new StringBuilder(); sbunion.Append(_select);
sb.Append(_select); if (_distinct) sbunion.Append("DISTINCT ");
if (_distinct) sb.Append("DISTINCT "); sbunion.Append(field);
sb.Append(field); if (string.IsNullOrEmpty(_orderby) && _skip > 0) sbunion.Append(", ROWNUM AS \"__rownum__\"");
if (string.IsNullOrEmpty(_orderby) && _skip > 0) sb.Append(", ROWNUM AS \"__rownum__\""); sbunion.Append(" \r\nFROM ");
sb.Append(" \r\nFROM ");
var tbsjoin = _tables.Where(a => a.Type != SelectTableInfoType.From).ToArray(); var tbsjoin = _tables.Where(a => a.Type != SelectTableInfoType.From).ToArray();
var tbsfrom = _tables.Where(a => a.Type == SelectTableInfoType.From).ToArray(); var tbsfrom = _tables.Where(a => a.Type == SelectTableInfoType.From).ToArray();
for (var a = 0; a < tbsfrom.Length; a++) for (var a = 0; a < tbsfrom.Length; a++)
{ {
sb.Append(_commonUtils.QuoteSqlName(tbUnion[tbsfrom[a].Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tbsfrom[a].Table.Type, tbsfrom[a].Alias) ?? tbsfrom[a].Alias); sbunion.Append(_commonUtils.QuoteSqlName(tbUnion[tbsfrom[a].Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tbsfrom[a].Table.Type, tbsfrom[a].Alias) ?? tbsfrom[a].Alias);
if (tbsjoin.Length > 0) if (tbsjoin.Length > 0)
{ {
//如果存在 join 查询,则处理 from t1, t2 改为 from t1 inner join t2 on 1 = 1 //如果存在 join 查询,则处理 from t1, t2 改为 from t1 inner join t2 on 1 = 1
for (var b = 1; b < tbsfrom.Length; b++) for (var b = 1; b < tbsfrom.Length; b++)
{ {
sb.Append(" \r\nLEFT JOIN ").Append(_commonUtils.QuoteSqlName(tbUnion[tbsfrom[b].Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tbsfrom[b].Table.Type, tbsfrom[b].Alias) ?? tbsfrom[b].Alias); sbunion.Append(" \r\nLEFT JOIN ").Append(_commonUtils.QuoteSqlName(tbUnion[tbsfrom[b].Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tbsfrom[b].Table.Type, tbsfrom[b].Alias) ?? tbsfrom[b].Alias);
if (string.IsNullOrEmpty(tbsfrom[b].NavigateCondition) && string.IsNullOrEmpty(tbsfrom[b].On) && string.IsNullOrEmpty(tbsfrom[b].Cascade)) sb.Append(" ON 1 = 1"); if (string.IsNullOrEmpty(tbsfrom[b].NavigateCondition) && string.IsNullOrEmpty(tbsfrom[b].On) && string.IsNullOrEmpty(tbsfrom[b].Cascade)) sbunion.Append(" ON 1 = 1");
else else
{ {
var onSql = tbsfrom[b].NavigateCondition ?? tbsfrom[b].On; var onSql = tbsfrom[b].NavigateCondition ?? tbsfrom[b].On;
sb.Append(" ON ").Append(onSql); sbunion.Append(" ON ").Append(onSql);
if (string.IsNullOrEmpty(tbsfrom[b].Cascade) == false) if (string.IsNullOrEmpty(tbsfrom[b].Cascade) == false)
{ {
if (string.IsNullOrEmpty(onSql)) sb.Append(tbsfrom[b].Cascade); if (string.IsNullOrEmpty(onSql)) sbunion.Append(tbsfrom[b].Cascade);
else sb.Append(" AND ").Append(tbsfrom[b].Cascade); else sbunion.Append(" AND ").Append(tbsfrom[b].Cascade);
} }
} }
} }
@ -67,7 +67,7 @@ namespace FreeSql.Dameng.Curd
if (!string.IsNullOrEmpty(tbsfrom[a].On)) sbnav.Append(" AND (").Append(tbsfrom[a].On).Append(")"); if (!string.IsNullOrEmpty(tbsfrom[a].On)) sbnav.Append(" AND (").Append(tbsfrom[a].On).Append(")");
if (a > 0 && !string.IsNullOrEmpty(tbsfrom[a].Cascade)) sbnav.Append(" AND ").Append(tbsfrom[a].Cascade); if (a > 0 && !string.IsNullOrEmpty(tbsfrom[a].Cascade)) sbnav.Append(" AND ").Append(tbsfrom[a].Cascade);
} }
if (a < tbsfrom.Length - 1) sb.Append(", "); if (a < tbsfrom.Length - 1) sbunion.Append(", ");
} }
foreach (var tb in tbsjoin) foreach (var tb in tbsjoin)
{ {
@ -75,20 +75,20 @@ namespace FreeSql.Dameng.Curd
switch (tb.Type) switch (tb.Type)
{ {
case SelectTableInfoType.LeftJoin: case SelectTableInfoType.LeftJoin:
sb.Append(" \r\nLEFT JOIN "); sbunion.Append(" \r\nLEFT JOIN ");
break; break;
case SelectTableInfoType.InnerJoin: case SelectTableInfoType.InnerJoin:
sb.Append(" \r\nINNER JOIN "); sbunion.Append(" \r\nINNER JOIN ");
break; break;
case SelectTableInfoType.RightJoin: case SelectTableInfoType.RightJoin:
sb.Append(" \r\nRIGHT JOIN "); sbunion.Append(" \r\nRIGHT JOIN ");
break; break;
} }
sb.Append(_commonUtils.QuoteSqlName(tbUnion[tb.Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tb.Table.Type, tb.Alias) ?? tb.Alias).Append(" ON ").Append(tb.On ?? tb.NavigateCondition); sbunion.Append(_commonUtils.QuoteSqlName(tbUnion[tb.Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tb.Table.Type, tb.Alias) ?? tb.Alias).Append(" ON ").Append(tb.On ?? tb.NavigateCondition);
if (!string.IsNullOrEmpty(tb.Cascade)) sb.Append(" AND ").Append(tb.Cascade); if (!string.IsNullOrEmpty(tb.Cascade)) sbunion.Append(" AND ").Append(tb.Cascade);
if (!string.IsNullOrEmpty(tb.On) && !string.IsNullOrEmpty(tb.NavigateCondition)) sbnav.Append(" AND (").Append(tb.NavigateCondition).Append(")"); if (!string.IsNullOrEmpty(tb.On) && !string.IsNullOrEmpty(tb.NavigateCondition)) sbnav.Append(" AND (").Append(tb.NavigateCondition).Append(")");
} }
if (_join.Length > 0) sb.Append(_join); if (_join.Length > 0) sbunion.Append(_join);
sbnav.Append(_where); sbnav.Append(_where);
if (!string.IsNullOrEmpty(_tables[0].Cascade)) if (!string.IsNullOrEmpty(_tables[0].Cascade))
@ -97,31 +97,39 @@ namespace FreeSql.Dameng.Curd
if (string.IsNullOrEmpty(_orderby) && (_skip > 0 || _limit > 0)) if (string.IsNullOrEmpty(_orderby) && (_skip > 0 || _limit > 0))
sbnav.Append(" AND ROWNUM < ").Append(_skip + _limit + 1); sbnav.Append(" AND ROWNUM < ").Append(_skip + _limit + 1);
if (sbnav.Length > 0) if (sbnav.Length > 0)
sb.Append(" \r\nWHERE ").Append(sbnav.Remove(0, 5)); sbunion.Append(" \r\nWHERE ").Append(sbnav.Remove(0, 5));
if (string.IsNullOrEmpty(_groupby) == false) if (string.IsNullOrEmpty(_groupby) == false)
{ {
sb.Append(_groupby); sbunion.Append(_groupby);
if (string.IsNullOrEmpty(_having) == false) if (string.IsNullOrEmpty(_having) == false)
sb.Append(" \r\nHAVING ").Append(_having.Substring(5)); sbunion.Append(" \r\nHAVING ").Append(_having.Substring(5));
} }
sb.Append(_orderby); sbunion.Append(_orderby);
if (string.IsNullOrEmpty(_orderby)) if (string.IsNullOrEmpty(_orderby))
{ {
if (_skip > 0) if (_skip > 0)
sb.Insert(0, $"{_select} t.* FROM (").Append(") t WHERE t.\"__rownum__\" > ").Append(_skip); sbunion.Insert(0, $"{_select}t.* FROM (").Append(") t WHERE t.\"__rownum__\" > ").Append(_skip);
} }
else else
{ {
if (_skip > 0 && _limit > 0) sb.Insert(0, $"{_select} t.* FROM (SELECT rt.*, ROWNUM AS \"__rownum__\" FROM (").Append(") rt WHERE ROWNUM < ").Append(_skip + _limit + 1).Append(") t WHERE t.\"__rownum__\" > ").Append(_skip); if (_skip > 0 && _limit > 0) sbunion.Insert(0, $"{_select}t.* FROM (SELECT rt.*, ROWNUM AS \"__rownum__\" FROM (").Append(") rt WHERE ROWNUM < ").Append(_skip + _limit + 1).Append(") t WHERE t.\"__rownum__\" > ").Append(_skip);
else if (_skip > 0) sb.Insert(0, $"{_select} t.* FROM (").Append(") t WHERE ROWNUM > ").Append(_skip); else if (_skip > 0) sbunion.Insert(0, $"{_select}t.* FROM (").Append(") t WHERE ROWNUM > ").Append(_skip);
else if (_limit > 0) sb.Insert(0, $"{_select} t.* FROM (").Append(") t WHERE ROWNUM < ").Append(_limit + 1); else if (_limit > 0) sbunion.Insert(0, $"{_select}t.* FROM (").Append(") t WHERE ROWNUM < ").Append(_limit + 1);
} }
if (tbUnionsGt0) sbunion.Insert(0, $"{_select}* from (").Append(") ftb");
sb.Append(sbunion);
sbnav.Clear(); sbnav.Clear();
if (tbUnionsGt0) sb.Append(") ftb"); sbunion.Clear();
} }
return sb.Append(_tosqlAppendContent).ToString(); var sql = sb.Append(_tosqlAppendContent).ToString();
var aliasGreater30 = 0;
foreach (var tb in _tables)
if (tb.Alias.Length > 30) sql = sql.Replace(tb.Alias, $"than30_{aliasGreater30++}");
return sql;
} }
public DamengSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { } public DamengSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { }

View File

@ -22,40 +22,40 @@ namespace FreeSql.Odbc.Dameng
tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter, true); tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter, true);
var sb = new StringBuilder(); var sb = new StringBuilder();
var sbunion = new StringBuilder();
var sbnav = new StringBuilder();
var tbUnionsGt0 = tbUnions.Count > 1; var tbUnionsGt0 = tbUnions.Count > 1;
for (var tbUnionsIdx = 0; tbUnionsIdx < tbUnions.Count; tbUnionsIdx++) for (var tbUnionsIdx = 0; tbUnionsIdx < tbUnions.Count; tbUnionsIdx++)
{ {
if (tbUnionsIdx > 0) sb.Append("\r\n \r\nUNION ALL\r\n \r\n"); if (tbUnionsIdx > 0) sb.Append("\r\n \r\nUNION ALL\r\n \r\n");
if (tbUnionsGt0) sb.Append(_select).Append(" * from (");
var tbUnion = tbUnions[tbUnionsIdx]; var tbUnion = tbUnions[tbUnionsIdx];
var sbnav = new StringBuilder(); sbunion.Append(_select);
sb.Append(_select); if (_distinct) sbunion.Append("DISTINCT ");
if (_distinct) sb.Append("DISTINCT "); sbunion.Append(field);
sb.Append(field); if (string.IsNullOrEmpty(_orderby) && _skip > 0) sbunion.Append(", ROWNUM AS \"__rownum__\"");
if (string.IsNullOrEmpty(_orderby) && _skip > 0) sb.Append(", ROWNUM AS \"__rownum__\""); sbunion.Append(" \r\nFROM ");
sb.Append(" \r\nFROM ");
var tbsjoin = _tables.Where(a => a.Type != SelectTableInfoType.From).ToArray(); var tbsjoin = _tables.Where(a => a.Type != SelectTableInfoType.From).ToArray();
var tbsfrom = _tables.Where(a => a.Type == SelectTableInfoType.From).ToArray(); var tbsfrom = _tables.Where(a => a.Type == SelectTableInfoType.From).ToArray();
for (var a = 0; a < tbsfrom.Length; a++) for (var a = 0; a < tbsfrom.Length; a++)
{ {
sb.Append(_commonUtils.QuoteSqlName(tbUnion[tbsfrom[a].Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tbsfrom[a].Table.Type, tbsfrom[a].Alias) ?? tbsfrom[a].Alias); sbunion.Append(_commonUtils.QuoteSqlName(tbUnion[tbsfrom[a].Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tbsfrom[a].Table.Type, tbsfrom[a].Alias) ?? tbsfrom[a].Alias);
if (tbsjoin.Length > 0) if (tbsjoin.Length > 0)
{ {
//如果存在 join 查询,则处理 from t1, t2 改为 from t1 inner join t2 on 1 = 1 //如果存在 join 查询,则处理 from t1, t2 改为 from t1 inner join t2 on 1 = 1
for (var b = 1; b < tbsfrom.Length; b++) for (var b = 1; b < tbsfrom.Length; b++)
{ {
sb.Append(" \r\nLEFT JOIN ").Append(_commonUtils.QuoteSqlName(tbUnion[tbsfrom[b].Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tbsfrom[b].Table.Type, tbsfrom[b].Alias) ?? tbsfrom[b].Alias); sbunion.Append(" \r\nLEFT JOIN ").Append(_commonUtils.QuoteSqlName(tbUnion[tbsfrom[b].Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tbsfrom[b].Table.Type, tbsfrom[b].Alias) ?? tbsfrom[b].Alias);
if (string.IsNullOrEmpty(tbsfrom[b].NavigateCondition) && string.IsNullOrEmpty(tbsfrom[b].On) && string.IsNullOrEmpty(tbsfrom[b].Cascade)) sb.Append(" ON 1 = 1"); if (string.IsNullOrEmpty(tbsfrom[b].NavigateCondition) && string.IsNullOrEmpty(tbsfrom[b].On) && string.IsNullOrEmpty(tbsfrom[b].Cascade)) sbunion.Append(" ON 1 = 1");
else else
{ {
var onSql = tbsfrom[b].NavigateCondition ?? tbsfrom[b].On; var onSql = tbsfrom[b].NavigateCondition ?? tbsfrom[b].On;
sb.Append(" ON ").Append(onSql); sbunion.Append(" ON ").Append(onSql);
if (string.IsNullOrEmpty(tbsfrom[b].Cascade) == false) if (string.IsNullOrEmpty(tbsfrom[b].Cascade) == false)
{ {
if (string.IsNullOrEmpty(onSql)) sb.Append(tbsfrom[b].Cascade); if (string.IsNullOrEmpty(onSql)) sbunion.Append(tbsfrom[b].Cascade);
else sb.Append(" AND ").Append(tbsfrom[b].Cascade); else sbunion.Append(" AND ").Append(tbsfrom[b].Cascade);
} }
} }
} }
@ -67,7 +67,7 @@ namespace FreeSql.Odbc.Dameng
if (!string.IsNullOrEmpty(tbsfrom[a].On)) sbnav.Append(" AND (").Append(tbsfrom[a].On).Append(")"); if (!string.IsNullOrEmpty(tbsfrom[a].On)) sbnav.Append(" AND (").Append(tbsfrom[a].On).Append(")");
if (a > 0 && !string.IsNullOrEmpty(tbsfrom[a].Cascade)) sbnav.Append(" AND ").Append(tbsfrom[a].Cascade); if (a > 0 && !string.IsNullOrEmpty(tbsfrom[a].Cascade)) sbnav.Append(" AND ").Append(tbsfrom[a].Cascade);
} }
if (a < tbsfrom.Length - 1) sb.Append(", "); if (a < tbsfrom.Length - 1) sbunion.Append(", ");
} }
foreach (var tb in tbsjoin) foreach (var tb in tbsjoin)
{ {
@ -75,20 +75,20 @@ namespace FreeSql.Odbc.Dameng
switch (tb.Type) switch (tb.Type)
{ {
case SelectTableInfoType.LeftJoin: case SelectTableInfoType.LeftJoin:
sb.Append(" \r\nLEFT JOIN "); sbunion.Append(" \r\nLEFT JOIN ");
break; break;
case SelectTableInfoType.InnerJoin: case SelectTableInfoType.InnerJoin:
sb.Append(" \r\nINNER JOIN "); sbunion.Append(" \r\nINNER JOIN ");
break; break;
case SelectTableInfoType.RightJoin: case SelectTableInfoType.RightJoin:
sb.Append(" \r\nRIGHT JOIN "); sbunion.Append(" \r\nRIGHT JOIN ");
break; break;
} }
sb.Append(_commonUtils.QuoteSqlName(tbUnion[tb.Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tb.Table.Type, tb.Alias) ?? tb.Alias).Append(" ON ").Append(tb.On ?? tb.NavigateCondition); sbunion.Append(_commonUtils.QuoteSqlName(tbUnion[tb.Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tb.Table.Type, tb.Alias) ?? tb.Alias).Append(" ON ").Append(tb.On ?? tb.NavigateCondition);
if (!string.IsNullOrEmpty(tb.Cascade)) sb.Append(" AND ").Append(tb.Cascade); if (!string.IsNullOrEmpty(tb.Cascade)) sbunion.Append(" AND ").Append(tb.Cascade);
if (!string.IsNullOrEmpty(tb.On) && !string.IsNullOrEmpty(tb.NavigateCondition)) sbnav.Append(" AND (").Append(tb.NavigateCondition).Append(")"); if (!string.IsNullOrEmpty(tb.On) && !string.IsNullOrEmpty(tb.NavigateCondition)) sbnav.Append(" AND (").Append(tb.NavigateCondition).Append(")");
} }
if (_join.Length > 0) sb.Append(_join); if (_join.Length > 0) sbunion.Append(_join);
sbnav.Append(_where); sbnav.Append(_where);
if (!string.IsNullOrEmpty(_tables[0].Cascade)) if (!string.IsNullOrEmpty(_tables[0].Cascade))
@ -97,31 +97,39 @@ namespace FreeSql.Odbc.Dameng
if (string.IsNullOrEmpty(_orderby) && (_skip > 0 || _limit > 0)) if (string.IsNullOrEmpty(_orderby) && (_skip > 0 || _limit > 0))
sbnav.Append(" AND ROWNUM < ").Append(_skip + _limit + 1); sbnav.Append(" AND ROWNUM < ").Append(_skip + _limit + 1);
if (sbnav.Length > 0) if (sbnav.Length > 0)
sb.Append(" \r\nWHERE ").Append(sbnav.Remove(0, 5)); sbunion.Append(" \r\nWHERE ").Append(sbnav.Remove(0, 5));
if (string.IsNullOrEmpty(_groupby) == false) if (string.IsNullOrEmpty(_groupby) == false)
{ {
sb.Append(_groupby); sbunion.Append(_groupby);
if (string.IsNullOrEmpty(_having) == false) if (string.IsNullOrEmpty(_having) == false)
sb.Append(" \r\nHAVING ").Append(_having.Substring(5)); sbunion.Append(" \r\nHAVING ").Append(_having.Substring(5));
} }
sb.Append(_orderby); sbunion.Append(_orderby);
if (string.IsNullOrEmpty(_orderby)) if (string.IsNullOrEmpty(_orderby))
{ {
if (_skip > 0) if (_skip > 0)
sb.Insert(0, $"{_select} t.* FROM (").Append(") t WHERE t.\"__rownum__\" > ").Append(_skip); sbunion.Insert(0, $"{_select}t.* FROM (").Append(") t WHERE t.\"__rownum__\" > ").Append(_skip);
} }
else else
{ {
if (_skip > 0 && _limit > 0) sb.Insert(0, $"{_select} t.* FROM (SELECT rt.*, ROWNUM AS \"__rownum__\" FROM (").Append(") rt WHERE ROWNUM < ").Append(_skip + _limit + 1).Append(") t WHERE t.\"__rownum__\" > ").Append(_skip); if (_skip > 0 && _limit > 0) sbunion.Insert(0, $"{_select}t.* FROM (SELECT rt.*, ROWNUM AS \"__rownum__\" FROM (").Append(") rt WHERE ROWNUM < ").Append(_skip + _limit + 1).Append(") t WHERE t.\"__rownum__\" > ").Append(_skip);
else if (_skip > 0) sb.Insert(0, $"{_select} t.* FROM (").Append(") t WHERE ROWNUM > ").Append(_skip); else if (_skip > 0) sbunion.Insert(0, $"{_select}t.* FROM (").Append(") t WHERE ROWNUM > ").Append(_skip);
else if (_limit > 0) sb.Insert(0, $"{_select} t.* FROM (").Append(") t WHERE ROWNUM < ").Append(_limit + 1); else if (_limit > 0) sbunion.Insert(0, $"{_select}t.* FROM (").Append(") t WHERE ROWNUM < ").Append(_limit + 1);
} }
if (tbUnionsGt0) sbunion.Insert(0, $"{_select}* from (").Append(") ftb");
sb.Append(sbunion);
sbnav.Clear(); sbnav.Clear();
if (tbUnionsGt0) sb.Append(") ftb"); sbunion.Clear();
} }
return sb.Append(_tosqlAppendContent).ToString(); var sql = sb.Append(_tosqlAppendContent).ToString();
var aliasGreater30 = 0;
foreach (var tb in _tables)
if (tb.Alias.Length > 30) sql = sql.Replace(tb.Alias, $"than30_{aliasGreater30++}");
return sql;
} }
public OdbcDamengSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { } public OdbcDamengSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { }

View File

@ -22,40 +22,40 @@ namespace FreeSql.Odbc.Oracle
tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter, true); tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter, true);
var sb = new StringBuilder(); var sb = new StringBuilder();
var sbunion = new StringBuilder();
var sbnav = new StringBuilder();
var tbUnionsGt0 = tbUnions.Count > 1; var tbUnionsGt0 = tbUnions.Count > 1;
for (var tbUnionsIdx = 0; tbUnionsIdx < tbUnions.Count; tbUnionsIdx++) for (var tbUnionsIdx = 0; tbUnionsIdx < tbUnions.Count; tbUnionsIdx++)
{ {
if (tbUnionsIdx > 0) sb.Append("\r\n \r\nUNION ALL\r\n \r\n"); if (tbUnionsIdx > 0) sb.Append("\r\n \r\nUNION ALL\r\n \r\n");
if (tbUnionsGt0) sb.Append(_select).Append(" * from (");
var tbUnion = tbUnions[tbUnionsIdx]; var tbUnion = tbUnions[tbUnionsIdx];
var sbnav = new StringBuilder(); sbunion.Append(_select);
sb.Append(_select); if (_distinct) sbunion.Append("DISTINCT ");
if (_distinct) sb.Append("DISTINCT "); sbunion.Append(field);
sb.Append(field); if (string.IsNullOrEmpty(_orderby) && _skip > 0) sbunion.Append(", ROWNUM AS \"__rownum__\"");
if (string.IsNullOrEmpty(_orderby) && _skip > 0) sb.Append(", ROWNUM AS \"__rownum__\""); sbunion.Append(" \r\nFROM ");
sb.Append(" \r\nFROM ");
var tbsjoin = _tables.Where(a => a.Type != SelectTableInfoType.From).ToArray(); var tbsjoin = _tables.Where(a => a.Type != SelectTableInfoType.From).ToArray();
var tbsfrom = _tables.Where(a => a.Type == SelectTableInfoType.From).ToArray(); var tbsfrom = _tables.Where(a => a.Type == SelectTableInfoType.From).ToArray();
for (var a = 0; a < tbsfrom.Length; a++) for (var a = 0; a < tbsfrom.Length; a++)
{ {
sb.Append(_commonUtils.QuoteSqlName(tbUnion[tbsfrom[a].Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tbsfrom[a].Table.Type, tbsfrom[a].Alias) ?? tbsfrom[a].Alias); sbunion.Append(_commonUtils.QuoteSqlName(tbUnion[tbsfrom[a].Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tbsfrom[a].Table.Type, tbsfrom[a].Alias) ?? tbsfrom[a].Alias);
if (tbsjoin.Length > 0) if (tbsjoin.Length > 0)
{ {
//如果存在 join 查询,则处理 from t1, t2 改为 from t1 inner join t2 on 1 = 1 //如果存在 join 查询,则处理 from t1, t2 改为 from t1 inner join t2 on 1 = 1
for (var b = 1; b < tbsfrom.Length; b++) for (var b = 1; b < tbsfrom.Length; b++)
{ {
sb.Append(" \r\nLEFT JOIN ").Append(_commonUtils.QuoteSqlName(tbUnion[tbsfrom[b].Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tbsfrom[b].Table.Type, tbsfrom[b].Alias) ?? tbsfrom[b].Alias); sbunion.Append(" \r\nLEFT JOIN ").Append(_commonUtils.QuoteSqlName(tbUnion[tbsfrom[b].Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tbsfrom[b].Table.Type, tbsfrom[b].Alias) ?? tbsfrom[b].Alias);
if (string.IsNullOrEmpty(tbsfrom[b].NavigateCondition) && string.IsNullOrEmpty(tbsfrom[b].On) && string.IsNullOrEmpty(tbsfrom[b].Cascade)) sb.Append(" ON 1 = 1"); if (string.IsNullOrEmpty(tbsfrom[b].NavigateCondition) && string.IsNullOrEmpty(tbsfrom[b].On) && string.IsNullOrEmpty(tbsfrom[b].Cascade)) sbunion.Append(" ON 1 = 1");
else else
{ {
var onSql = tbsfrom[b].NavigateCondition ?? tbsfrom[b].On; var onSql = tbsfrom[b].NavigateCondition ?? tbsfrom[b].On;
sb.Append(" ON ").Append(onSql); sbunion.Append(" ON ").Append(onSql);
if (string.IsNullOrEmpty(tbsfrom[b].Cascade) == false) if (string.IsNullOrEmpty(tbsfrom[b].Cascade) == false)
{ {
if (string.IsNullOrEmpty(onSql)) sb.Append(tbsfrom[b].Cascade); if (string.IsNullOrEmpty(onSql)) sbunion.Append(tbsfrom[b].Cascade);
else sb.Append(" AND ").Append(tbsfrom[b].Cascade); else sbunion.Append(" AND ").Append(tbsfrom[b].Cascade);
} }
} }
} }
@ -67,7 +67,7 @@ namespace FreeSql.Odbc.Oracle
if (!string.IsNullOrEmpty(tbsfrom[a].On)) sbnav.Append(" AND (").Append(tbsfrom[a].On).Append(")"); if (!string.IsNullOrEmpty(tbsfrom[a].On)) sbnav.Append(" AND (").Append(tbsfrom[a].On).Append(")");
if (a > 0 && !string.IsNullOrEmpty(tbsfrom[a].Cascade)) sbnav.Append(" AND ").Append(tbsfrom[a].Cascade); if (a > 0 && !string.IsNullOrEmpty(tbsfrom[a].Cascade)) sbnav.Append(" AND ").Append(tbsfrom[a].Cascade);
} }
if (a < tbsfrom.Length - 1) sb.Append(", "); if (a < tbsfrom.Length - 1) sbunion.Append(", ");
} }
foreach (var tb in tbsjoin) foreach (var tb in tbsjoin)
{ {
@ -75,20 +75,20 @@ namespace FreeSql.Odbc.Oracle
switch (tb.Type) switch (tb.Type)
{ {
case SelectTableInfoType.LeftJoin: case SelectTableInfoType.LeftJoin:
sb.Append(" \r\nLEFT JOIN "); sbunion.Append(" \r\nLEFT JOIN ");
break; break;
case SelectTableInfoType.InnerJoin: case SelectTableInfoType.InnerJoin:
sb.Append(" \r\nINNER JOIN "); sbunion.Append(" \r\nINNER JOIN ");
break; break;
case SelectTableInfoType.RightJoin: case SelectTableInfoType.RightJoin:
sb.Append(" \r\nRIGHT JOIN "); sbunion.Append(" \r\nRIGHT JOIN ");
break; break;
} }
sb.Append(_commonUtils.QuoteSqlName(tbUnion[tb.Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tb.Table.Type, tb.Alias) ?? tb.Alias).Append(" ON ").Append(tb.On ?? tb.NavigateCondition); sbunion.Append(_commonUtils.QuoteSqlName(tbUnion[tb.Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tb.Table.Type, tb.Alias) ?? tb.Alias).Append(" ON ").Append(tb.On ?? tb.NavigateCondition);
if (!string.IsNullOrEmpty(tb.Cascade)) sb.Append(" AND ").Append(tb.Cascade); if (!string.IsNullOrEmpty(tb.Cascade)) sbunion.Append(" AND ").Append(tb.Cascade);
if (!string.IsNullOrEmpty(tb.On) && !string.IsNullOrEmpty(tb.NavigateCondition)) sbnav.Append(" AND (").Append(tb.NavigateCondition).Append(")"); if (!string.IsNullOrEmpty(tb.On) && !string.IsNullOrEmpty(tb.NavigateCondition)) sbnav.Append(" AND (").Append(tb.NavigateCondition).Append(")");
} }
if (_join.Length > 0) sb.Append(_join); if (_join.Length > 0) sbunion.Append(_join);
sbnav.Append(_where); sbnav.Append(_where);
if (!string.IsNullOrEmpty(_tables[0].Cascade)) if (!string.IsNullOrEmpty(_tables[0].Cascade))
@ -97,29 +97,31 @@ namespace FreeSql.Odbc.Oracle
if (string.IsNullOrEmpty(_orderby) && (_skip > 0 || _limit > 0)) if (string.IsNullOrEmpty(_orderby) && (_skip > 0 || _limit > 0))
sbnav.Append(" AND ROWNUM < ").Append(_skip + _limit + 1); sbnav.Append(" AND ROWNUM < ").Append(_skip + _limit + 1);
if (sbnav.Length > 0) if (sbnav.Length > 0)
sb.Append(" \r\nWHERE ").Append(sbnav.Remove(0, 5)); sbunion.Append(" \r\nWHERE ").Append(sbnav.Remove(0, 5));
if (string.IsNullOrEmpty(_groupby) == false) if (string.IsNullOrEmpty(_groupby) == false)
{ {
sb.Append(_groupby); sbunion.Append(_groupby);
if (string.IsNullOrEmpty(_having) == false) if (string.IsNullOrEmpty(_having) == false)
sb.Append(" \r\nHAVING ").Append(_having.Substring(5)); sbunion.Append(" \r\nHAVING ").Append(_having.Substring(5));
} }
sb.Append(_orderby); sbunion.Append(_orderby);
if (string.IsNullOrEmpty(_orderby)) if (string.IsNullOrEmpty(_orderby))
{ {
if (_skip > 0) if (_skip > 0)
sb.Insert(0, $"{_select} t.* FROM (").Append(") t WHERE t.\"__rownum__\" > ").Append(_skip); sbunion.Insert(0, $"{_select}t.* FROM (").Append(") t WHERE t.\"__rownum__\" > ").Append(_skip);
} }
else else
{ {
if (_skip > 0 && _limit > 0) sb.Insert(0, $"{_select} t.* FROM (SELECT rt.*, ROWNUM AS \"__rownum__\" FROM (").Append(") rt WHERE ROWNUM < ").Append(_skip + _limit + 1).Append(") t WHERE t.\"__rownum__\" > ").Append(_skip); if (_skip > 0 && _limit > 0) sbunion.Insert(0, $"{_select}t.* FROM (SELECT rt.*, ROWNUM AS \"__rownum__\" FROM (").Append(") rt WHERE ROWNUM < ").Append(_skip + _limit + 1).Append(") t WHERE t.\"__rownum__\" > ").Append(_skip);
else if (_skip > 0) sb.Insert(0, $"{_select} t.* FROM (").Append(") t WHERE ROWNUM > ").Append(_skip); else if (_skip > 0) sbunion.Insert(0, $"{_select}t.* FROM (").Append(") t WHERE ROWNUM > ").Append(_skip);
else if (_limit > 0) sb.Insert(0, $"{_select} t.* FROM (").Append(") t WHERE ROWNUM < ").Append(_limit + 1); else if (_limit > 0) sbunion.Insert(0, $"{_select}t.* FROM (").Append(") t WHERE ROWNUM < ").Append(_limit + 1);
} }
if (tbUnionsGt0) sbunion.Insert(0, $"{_select}* from (").Append(") ftb");
sb.Append(sbunion);
sbnav.Clear(); sbnav.Clear();
if (tbUnionsGt0) sb.Append(") ftb"); sbunion.Clear();
} }
var sql = sb.Append(_tosqlAppendContent).ToString(); var sql = sb.Append(_tosqlAppendContent).ToString();

View File

@ -22,40 +22,40 @@ namespace FreeSql.Oracle.Curd
tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter, true); tb.Cascade = _commonExpression.GetWhereCascadeSql(tb, _whereGlobalFilter, true);
var sb = new StringBuilder(); var sb = new StringBuilder();
var sbunion = new StringBuilder();
var sbnav = new StringBuilder();
var tbUnionsGt0 = tbUnions.Count > 1; var tbUnionsGt0 = tbUnions.Count > 1;
for (var tbUnionsIdx = 0; tbUnionsIdx < tbUnions.Count; tbUnionsIdx++) for (var tbUnionsIdx = 0; tbUnionsIdx < tbUnions.Count; tbUnionsIdx++)
{ {
if (tbUnionsIdx > 0) sb.Append("\r\n \r\nUNION ALL\r\n \r\n"); if (tbUnionsIdx > 0) sb.Append("\r\n \r\nUNION ALL\r\n \r\n");
if (tbUnionsGt0) sb.Append(_select).Append(" * from (");
var tbUnion = tbUnions[tbUnionsIdx]; var tbUnion = tbUnions[tbUnionsIdx];
var sbnav = new StringBuilder(); sbunion.Append(_select);
sb.Append(_select); if (_distinct) sbunion.Append("DISTINCT ");
if (_distinct) sb.Append("DISTINCT "); sbunion.Append(field);
sb.Append(field); if (string.IsNullOrEmpty(_orderby) && _skip > 0) sbunion.Append(", ROWNUM AS \"__rownum__\"");
if (string.IsNullOrEmpty(_orderby) && _skip > 0) sb.Append(", ROWNUM AS \"__rownum__\""); sbunion.Append(" \r\nFROM ");
sb.Append(" \r\nFROM ");
var tbsjoin = _tables.Where(a => a.Type != SelectTableInfoType.From).ToArray(); var tbsjoin = _tables.Where(a => a.Type != SelectTableInfoType.From).ToArray();
var tbsfrom = _tables.Where(a => a.Type == SelectTableInfoType.From).ToArray(); var tbsfrom = _tables.Where(a => a.Type == SelectTableInfoType.From).ToArray();
for (var a = 0; a < tbsfrom.Length; a++) for (var a = 0; a < tbsfrom.Length; a++)
{ {
sb.Append(_commonUtils.QuoteSqlName(tbUnion[tbsfrom[a].Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tbsfrom[a].Table.Type, tbsfrom[a].Alias) ?? tbsfrom[a].Alias); sbunion.Append(_commonUtils.QuoteSqlName(tbUnion[tbsfrom[a].Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tbsfrom[a].Table.Type, tbsfrom[a].Alias) ?? tbsfrom[a].Alias);
if (tbsjoin.Length > 0) if (tbsjoin.Length > 0)
{ {
//如果存在 join 查询,则处理 from t1, t2 改为 from t1 inner join t2 on 1 = 1 //如果存在 join 查询,则处理 from t1, t2 改为 from t1 inner join t2 on 1 = 1
for (var b = 1; b < tbsfrom.Length; b++) for (var b = 1; b < tbsfrom.Length; b++)
{ {
sb.Append(" \r\nLEFT JOIN ").Append(_commonUtils.QuoteSqlName(tbUnion[tbsfrom[b].Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tbsfrom[b].Table.Type, tbsfrom[b].Alias) ?? tbsfrom[b].Alias); sbunion.Append(" \r\nLEFT JOIN ").Append(_commonUtils.QuoteSqlName(tbUnion[tbsfrom[b].Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tbsfrom[b].Table.Type, tbsfrom[b].Alias) ?? tbsfrom[b].Alias);
if (string.IsNullOrEmpty(tbsfrom[b].NavigateCondition) && string.IsNullOrEmpty(tbsfrom[b].On) && string.IsNullOrEmpty(tbsfrom[b].Cascade)) sb.Append(" ON 1 = 1"); if (string.IsNullOrEmpty(tbsfrom[b].NavigateCondition) && string.IsNullOrEmpty(tbsfrom[b].On) && string.IsNullOrEmpty(tbsfrom[b].Cascade)) sbunion.Append(" ON 1 = 1");
else else
{ {
var onSql = tbsfrom[b].NavigateCondition ?? tbsfrom[b].On; var onSql = tbsfrom[b].NavigateCondition ?? tbsfrom[b].On;
sb.Append(" ON ").Append(onSql); sbunion.Append(" ON ").Append(onSql);
if (string.IsNullOrEmpty(tbsfrom[b].Cascade) == false) if (string.IsNullOrEmpty(tbsfrom[b].Cascade) == false)
{ {
if (string.IsNullOrEmpty(onSql)) sb.Append(tbsfrom[b].Cascade); if (string.IsNullOrEmpty(onSql)) sbunion.Append(tbsfrom[b].Cascade);
else sb.Append(" AND ").Append(tbsfrom[b].Cascade); else sbunion.Append(" AND ").Append(tbsfrom[b].Cascade);
} }
} }
} }
@ -67,7 +67,7 @@ namespace FreeSql.Oracle.Curd
if (!string.IsNullOrEmpty(tbsfrom[a].On)) sbnav.Append(" AND (").Append(tbsfrom[a].On).Append(")"); if (!string.IsNullOrEmpty(tbsfrom[a].On)) sbnav.Append(" AND (").Append(tbsfrom[a].On).Append(")");
if (a > 0 && !string.IsNullOrEmpty(tbsfrom[a].Cascade)) sbnav.Append(" AND ").Append(tbsfrom[a].Cascade); if (a > 0 && !string.IsNullOrEmpty(tbsfrom[a].Cascade)) sbnav.Append(" AND ").Append(tbsfrom[a].Cascade);
} }
if (a < tbsfrom.Length - 1) sb.Append(", "); if (a < tbsfrom.Length - 1) sbunion.Append(", ");
} }
foreach (var tb in tbsjoin) foreach (var tb in tbsjoin)
{ {
@ -75,20 +75,20 @@ namespace FreeSql.Oracle.Curd
switch (tb.Type) switch (tb.Type)
{ {
case SelectTableInfoType.LeftJoin: case SelectTableInfoType.LeftJoin:
sb.Append(" \r\nLEFT JOIN "); sbunion.Append(" \r\nLEFT JOIN ");
break; break;
case SelectTableInfoType.InnerJoin: case SelectTableInfoType.InnerJoin:
sb.Append(" \r\nINNER JOIN "); sbunion.Append(" \r\nINNER JOIN ");
break; break;
case SelectTableInfoType.RightJoin: case SelectTableInfoType.RightJoin:
sb.Append(" \r\nRIGHT JOIN "); sbunion.Append(" \r\nRIGHT JOIN ");
break; break;
} }
sb.Append(_commonUtils.QuoteSqlName(tbUnion[tb.Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tb.Table.Type, tb.Alias) ?? tb.Alias).Append(" ON ").Append(tb.On ?? tb.NavigateCondition); sbunion.Append(_commonUtils.QuoteSqlName(tbUnion[tb.Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tb.Table.Type, tb.Alias) ?? tb.Alias).Append(" ON ").Append(tb.On ?? tb.NavigateCondition);
if (!string.IsNullOrEmpty(tb.Cascade)) sb.Append(" AND ").Append(tb.Cascade); if (!string.IsNullOrEmpty(tb.Cascade)) sbunion.Append(" AND ").Append(tb.Cascade);
if (!string.IsNullOrEmpty(tb.On) && !string.IsNullOrEmpty(tb.NavigateCondition)) sbnav.Append(" AND (").Append(tb.NavigateCondition).Append(")"); if (!string.IsNullOrEmpty(tb.On) && !string.IsNullOrEmpty(tb.NavigateCondition)) sbnav.Append(" AND (").Append(tb.NavigateCondition).Append(")");
} }
if (_join.Length > 0) sb.Append(_join); if (_join.Length > 0) sbunion.Append(_join);
sbnav.Append(_where); sbnav.Append(_where);
if (!string.IsNullOrEmpty(_tables[0].Cascade)) if (!string.IsNullOrEmpty(_tables[0].Cascade))
@ -97,29 +97,31 @@ namespace FreeSql.Oracle.Curd
if (string.IsNullOrEmpty(_orderby) && (_skip > 0 || _limit > 0)) if (string.IsNullOrEmpty(_orderby) && (_skip > 0 || _limit > 0))
sbnav.Append(" AND ROWNUM < ").Append(_skip + _limit + 1); sbnav.Append(" AND ROWNUM < ").Append(_skip + _limit + 1);
if (sbnav.Length > 0) if (sbnav.Length > 0)
sb.Append(" \r\nWHERE ").Append(sbnav.Remove(0, 5)); sbunion.Append(" \r\nWHERE ").Append(sbnav.Remove(0, 5));
if (string.IsNullOrEmpty(_groupby) == false) if (string.IsNullOrEmpty(_groupby) == false)
{ {
sb.Append(_groupby); sbunion.Append(_groupby);
if (string.IsNullOrEmpty(_having) == false) if (string.IsNullOrEmpty(_having) == false)
sb.Append(" \r\nHAVING ").Append(_having.Substring(5)); sbunion.Append(" \r\nHAVING ").Append(_having.Substring(5));
} }
sb.Append(_orderby); sbunion.Append(_orderby);
if (string.IsNullOrEmpty(_orderby)) if (string.IsNullOrEmpty(_orderby))
{ {
if (_skip > 0) if (_skip > 0)
sb.Insert(0, $"{_select} t.* FROM (").Append(") t WHERE t.\"__rownum__\" > ").Append(_skip); sbunion.Insert(0, $"{_select}t.* FROM (").Append(") t WHERE t.\"__rownum__\" > ").Append(_skip);
} }
else else
{ {
if (_skip > 0 && _limit > 0) sb.Insert(0, $"{_select} t.* FROM (SELECT rt.*, ROWNUM AS \"__rownum__\" FROM (").Append(") rt WHERE ROWNUM < ").Append(_skip + _limit + 1).Append(") t WHERE t.\"__rownum__\" > ").Append(_skip); if (_skip > 0 && _limit > 0) sbunion.Insert(0, $"{_select}t.* FROM (SELECT rt.*, ROWNUM AS \"__rownum__\" FROM (").Append(") rt WHERE ROWNUM < ").Append(_skip + _limit + 1).Append(") t WHERE t.\"__rownum__\" > ").Append(_skip);
else if (_skip > 0) sb.Insert(0, $"{_select} t.* FROM (").Append(") t WHERE ROWNUM > ").Append(_skip); else if (_skip > 0) sbunion.Insert(0, $"{_select}t.* FROM (").Append(") t WHERE ROWNUM > ").Append(_skip);
else if (_limit > 0) sb.Insert(0, $"{_select} t.* FROM (").Append(") t WHERE ROWNUM < ").Append(_limit + 1); else if (_limit > 0) sbunion.Insert(0, $"{_select}t.* FROM (").Append(") t WHERE ROWNUM < ").Append(_limit + 1);
} }
if (tbUnionsGt0) sbunion.Insert(0, $"{_select}* from (").Append(") ftb");
sb.Append(sbunion);
sbnav.Clear(); sbnav.Clear();
if (tbUnionsGt0) sb.Append(") ftb"); sbunion.Clear();
} }
var sql = sb.Append(_tosqlAppendContent).ToString(); var sql = sb.Append(_tosqlAppendContent).ToString();