Member 13005867 Ответов: 2

Таблица 1 имеет от города до города расстояние 400 км от Хайдарабада до Бангалора, 400 км от Бангалора до Хайдарабада, должен получить только один рекорд


Promble: - Таблица 1 имеет от города до города расстояние 400 км от Хайдарабада до Бангалора, 400 км от Бангалора до Хайдарабада, должна получить только одну запись, так как расстояние от Хайдарабада до Банглора составляет 400, а от Бангалора до Хайдарабада-400,
Исключите строку 3, так как никакой дублирующей записи для Варангала в Хайдарабаде нет.
Исключите строку 4, так как никакой дублирующей записи нет для Виджавады в Хайдарабаде.

Таблица1
Идентификатор FromCity расстояние в город
1 Хайдарабад Бангалор 400
2 Бангалор Хайдарабад 400
3 Варангал Хайдарабад 150
4 Виджавада Хайдарабад 400

Ожидаемый результат : - нужно получить только одну запись либо Row1, либо Row2 (без дубликатов записей), как показано ниже

Строка 1
Идентификатор FromCity расстояние в город
1 Хайдарабад Бангалор 400

(ИЛИ)

Строка 2
Идентификатор FromCity расстояние в город
2 Бангалор Хайдарабад 400

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

У меня сцепление FromCity + город + расстояние как ResultSet1, и в город + FromCity +расстояние, как результирующий набор 2

Идентификатор ResultSet1
HyderabadBangalore400 1

Идентификатор ResultSet2
HyderabadBangalore400 2

Теперь я не знаю, как идти дальше?Пожалуйста, дайте несколько идей по этой проблеме, чтобы решить ее

2 Ответов

Рейтинг:
2

CHill60

Используйте параметры, которые вы ищете в предложении SELECT, а не значения, возвращаемые из базы данных, и затем вы можете использовать DISTINCT, чтобы гарантировать, что получите только одну строку.

Подобный этому:

declare @city1 nvarchar(125) = 'Hyderabad'
declare @city2 nvarchar(125) = 'Bangalore'

SELECT DISTINCT @city1, @city2, Distance
FROM Table1
WHERE (FromCity = @city1 AND ToCity = @city2)
	OR
      (FromCity = @city2 AND ToCity = @city1)


[Правка - Интернет с колонкой код ]
Если вам нужен список идентификаторов, соответствующих этим двум городам, то создайте их CSV-список, например
SELECT DISTINCT @city1 AS CITY1, @city2 AS CITY2, Distance,
	IDS = STUFF((SELECT ', ' + CAST(id as nvarchar) FROM Table1 
				WHERE (FromCity = @city1 AND ToCity = @city2)
				OR (FromCity = @city2 AND ToCity = @city1)
		FOR XML PATH('')),1,2,'')

	FROM Table1
	WHERE (FromCity = @city1 AND ToCity = @city2)
	OR
	(FromCity = @city2 AND ToCity = @city1)

В качестве альтернативы вы можете получить идентификатор в отдельных столбцах, "обманув" его с помощью Min и Max (это предполагает, что вы не будете вставлять повторяющиеся записи в таблицу):
SELECT DISTINCT @city1 AS CITY1, @city2 AS CITY2, Distance, MIN(Id), MAX(Id)
FROM Table1
WHERE (FromCity = @city1 AND ToCity = @city2)
OR
(FromCity = @city2 AND ToCity = @city1)
GROUP BY Distance


[EDIT] OP уточнил ожидаемые результаты. Последний запрос даст вам то, что вам нужно, просто выберите любой MIN (Id) или Макс (Id).


Member 13005867

Мы получим различные значения со столбцами FromCity, ToCity, Distance, но ожидаемый результат - со столбцом ID таблицы,когда ID используется в приведенном выше запросе, мы получим две строки в результирующем наборе

CHill60

Какой код вы хотите?

Member 13005867

Вопрос обновлен сейчас, пожалуйста, пройдите и ожидаемый результат, как показано ниже

Ожидаемый результат : - нужно получить только одну запись либо Row1, либо Row2 (без дубликатов записей), как показано ниже

Строка 1
Идентификатор FromCity расстояние в город
1 Хайдарабад Бангалор 400

(ИЛИ)

Строка 2
Идентификатор FromCity расстояние в город
2 Бангалор Хайдарабад 400

CHill60

Я собираюсь выйти, поэтому я обновил свое решение двумя другими альтернативами

Member 13005867

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

CHill60

Тогда почему вы спросили, Как получить единственную запись?

Рейтинг:
15

RAMASWAMY EKAMBARAM

select fromcity, tocity, min(distance) distance
from
(
select case when fromcity > tocity then tocity else fromcity end fromcity,
case when fromcity > tocity then fromcity else tocity end tocity, distance
from table1
) a
group by fromcity, tocity

/* 
the min(distance) would not be even needed if you are sure that there is no inconsistency in the table ie. distance between bangalore and hyderabad is same in both records
*/


CHill60

Я могу дать вам только ту обратную связь, которую дала мне операция ... смотрите их комментарии к моему решению...
"Мы получим различные значения со столбцами FromCity, ToCity, Distance, но ожидаемый результат - со столбцом ID таблицы,когда ID используется в приведенном выше запросе, мы получим две строки в результирующем наборе"

Member 13005867

Я только что добавил столбец ID к вашему решению, Спасибо за решение.Модифицированный запрос выглядит следующим образом.

выберите fromcity, город, мин(расстояние) расстояние,мин(ИД) ИД
от
(
выберите случай, когда fromcity &ГТ; город потом город еще fromcity конце fromcity,
случай, когда fromcity &ГТ; город потом fromcity другой город конца в город, расстояние,код
из табл. 1
) ля
группа по fromcity, город

Member 13005867

Спасибо Вам за осуществимое решение, так как оно не проверяет запись мудро ,а выполняет пакетную обработку

Member 13005867

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

выберите fromcity, город, мин(расстояние) расстояние,мин(ИД) ИД
из табл. 1
группа по fromcity, город

CHill60

Вы не можете включить расстояние в SELECT, если вы также не включаете его в GROUP BY.