GururajCV Ответов: 1

Синтаксический анализ Sql - запросов в древовидную структуру


Привет

Мне нужна помощь по преобразованию SQL в дерево.
у меня есть SQL, как показано ниже

Select DOLLAR_SALES, UNIT_SALES, SUM(DOLLAR_SALES,45) as "SUM OF SALES" From IRVING_MARKET_ADVANTAGE Where PRODUCTS_SUB_BRAND in (Select top 7 PRODUCTS_SUB_BRAND From IRVING_MARKET_ADVANTAGE Where DOLLAR_SALES > 2000 And LATEST_YEAR_444 = 'LATEST 4 WEEKS ENDING 08-09-20') And PROJECTED_GEOGRAPHIES in ('TOTAL US - FOOD') Group by PRODUCTS_SUB_BRAND Order by PRODUCTS_SUB_BRAND desc


Мне нужно определить ниже

1) колонны
2) функции SQL
3) псевдоним
4) от
5) Где Столбцы
6) Где Значения
7) вложенный SQL
8) порядок членов
9) группировка по членам

Пожалуйста, направьте меня или пришлите мне фрагмент, чтобы достичь вышеуказанной логики.

заранее спасибо.

Что я уже пробовал:

ожидаемые результаты могут быть следующими:

запрос :
<pre>Select DOLLAR_SALES, UNIT_SALES, SUM(DOLLAR_SALES,45) as "SUM OF SALES" From IRVING_MARKET_ADVANTAGE Where PRODUCTS_SUB_BRAND in (Select top 7 PRODUCTS_SUB_BRAND From IRVING_MARKET_ADVANTAGE Where DOLLAR_SALES > 2000 And LATEST_YEAR_444 = 'LATEST 4 WEEKS ENDING 08-09-20') And PROJECTED_GEOGRAPHIES in ('TOTAL US - FOOD') Group by PRODUCTS_SUB_BRAND Order by PRODUCTS_SUB_BRAND desc


1) Columns
       a1=DOLLAR_SALES alias = null
       a2=UNIT_SALES alias = null
       a3=SUM(DOLLAR_SALES,45) alias "SUM OF SALES"
2) From
       IRVING_MARKET_ADVANTAGE
3) Where Columns
       PRODUCTS_SUB_BRAND = SUB_QUERY
       PROJECTED_GEOGRAPHIES in ('TOTAL US - FOOD')
       Has_SubQuery = Yes
4) If Sub Query
       <pre>Select top 7 PRODUCTS_SUB_BRAND From IRVING_MARKET_ADVANTAGE Where DOLLAR_SALES > 2000 And LATEST_YEAR_444 = 'LATEST 4 WEEKS ENDING 08-09-20'
5) Order By members
       PRODUCTS_SUB_BRAND descending
6) Group BY member
       PRODUCTS_SUB_BRAND

Richard MacCutchan

"Пожалуйста, направьте меня или пришлите мне фрагмент, чтобы достичь вышеуказанной логики."
Вопрос не совсем ясен. Вы должны объяснить, что вы имеете в виду под "я не достиг результатов"

Dave Kreskowiak

Похоже, это домашнее задание, и вы хотите, чтобы мы сделали работу за вас. Этого не случится.

Это проверка ваших знаний, а не наших.

1 Ответов

Рейтинг:
0

Maciej Los

Есть несколько SQL-парсер на Гугл[^].

Если вы не можете им воспользоваться, я бы посоветовал вам это сделать.:
1. Создайте список или словарь с ключевыми словами для поиска

Dictionary<string, string> keywords = new Dictionary<string, string>();
keywords.Add("columns", "SELECT");
keywords.Add("tables", "FROM");
keywords.Add("where", "WHERE");
keywords.Add("group", "GROUP BY");
keywords.Add("order", "ORDER BY");


2. Создайте список, в котором будет содержаться информация о созданных ключевых словах
List<Tuple<string, string, int>> found = new List<Tuple<string, string, int>>();
string sComm = "your select statement here";
foreach(string kw in keywords.Values)
{
	int start = 0;
	int end = sComm.Length;
	int at = 0;
	while(start<end)
	{
		at = sComm.IndexOf(kw, start, StringComparison.InvariantCultureIgnoreCase);
		if(at==-1) break;
		found.Add(new Tuple<string, string, int>(keywords.FirstOrDefault(x=>x.Value==kw).Key, kw, at));
		start=at+1;
	}
}
//sort by index of keyword
found = found.OrderBy(x=>x.Item3).ToList();


Найденный список выглядит так:
columns SELECT 0 
tables FROM 72 
where WHERE 101 
columns SELECT 132 
tables FROM 164 
where WHERE 193 
group GROUP BY 326 
order ORDER BY 356



Теперь вы должны реализовать механизм, который будет получать части между ключевыми словами. У меня нет достаточно времени, чтобы сделать это для вас.
Совет:
- столбцы в первом выборе находятся между символами sComm: 0 и 71
- таблицы в первом выборе находятся между символами: 72 и 100
- прием.
Если вы хотите удалить ключевое слово, вы должны добавить длину этого ключевого слова к исходному символу ;)

Удачи вам!