CPuser2020 Ответов: 2

Перекрестное применение запроса к одной и той же таблице SQL


Привет, у меня есть таблица, которую мне нужно самостоятельно запросить. Не слишком уверен, Нужно ли это делать с помощью соединения или перекрестного апли и т. д.

Стол стоит :
Авторизацию(AutheriseID(ПК), идентификатор пользователя, имя, AccountNumber, Имя_учетной_записи, матч, частота)

Мне нужно найти в таблице верхнюю запись с частотой 1, а также убедиться, что совпадение уже не существует в другой таблице:

select top 1* from authorise where  NOT EXISTS (SELECT *
                 FROM   trained
                 WHERE  authorise.name = trained.name AND
                        authorise.accountnumber = trained.accountnumber) and frequency = 1 order by UID


Это прекрасно работает. Но тогда мне также нужно получить остальные совпадения в таблице авторизации, которые соответствуют выбранному UID и номеру учетной записи вместе. Но нужно убедиться, что это все, что относится к вершине 1, где частота = 1.

Итак, в моей таблице, если следующая запись была результатом:

<pre>  select top 1* from authorise where  NOT EXISTS (SELECT *
                   FROM   trained
                   WHERE  authorise.name = trained.name AND
                          authorise.accountnumber = trained.accountnumber) and frequency = 1 order by UID


(10, 19, "Тест", 28, "Тест12", "Тест", 1)

И я хотел получить другие совпадения, связанные с тем же UID-19 и AccountNumber-28, тогда я получу больше записей, которые имеют совпадения и разные частоты. (Совпадения-это подстроки, поэтому я проверяю все реальные подстроки, чтобы определить хорошее совпадение по полной строке) DSo если бы было больше совпадений с этими UID и Accountnumber, это могло бы выглядеть следующим образом:
(10, 19, "Тест 12", 28, "Тест 12", "Тест", 1)
(134, 19, "Тест 12", 28, "Тест 12", "12", 4)
Это означает, что он совпал на двух подстроках исходного имени Test и 12

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

Я пробовал это, но дает мне ошибки:

select * from authorise where UID and AccountNumber esists(
		  select top 1 * from authorise where  NOT EXISTS (SELECT *
                   FROM   trained
                   WHERE  authorise.resellername = trained.resellername AND
                          authorise.accountnumber = trained.accountnumber) and frequency = 1 order by UID)

Richard MacCutchan

Какие ошибки?

CPuser2020

Привет, Ричард, я разобрался с этим, разделив "где":
выбрать различные * из авторизацию, где жидкость в (
выберите top 1 UID из authorize where NOT EXISTS (выберите *
Из подготовленных
Где именно authorise.name = trained.name и еще
authorize.accountnumber = trained.accountnumber) и frequency = 1 order by UID) и AccountNumber IN(
выберите top 1 ACCOUNTNUMBER из authorize where NOT EXISTS (выберите *
Из подготовленных
Где именно authorise.name = trained.name и еще
authorize.accountnumber = trained.accountnumber) и frequency = 1 order by UID)


Maciej Los

Если вы решили свою проблему, пожалуйста, удалите этот вопрос или предоставьте ответ.

#realJSOP

Предоставьте ответ-это желаемый путь, потому что он поможет кому-то еще, у кого есть подобная проблема.

CPuser2020

Привет вышеизложенное занимает несколько секунд для запуска в диспетчере sql server, но занимает целую вечность при запуске из приложения, вызывающего хранимую процедуру с помощью sqladapter. Я читал, что это из-за суб-квайров. Просто интересно, есть ли лучшее решение?

2 Ответов

Рейтинг:
16

CPuser2020

select * from authorise where UID IN (
select top 1 UID from authorise where NOT EXISTS (SELECT *
FROM trained
WHERE authorise.name = trained.name AND
authorise.accountnumber = trained.accountnumber) and frequency = 1 order by UID) AND AccountNumber IN(
select top 1 ACCOUNTNUMBER from authorise where NOT EXISTS (SELECT *
FROM trained
WHERE authorise.name = trained.name AND
authorise.accountnumber = trained.accountnumber) and frequency = 1 order by UID)


Maciej Los

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

Рейтинг:
0

NEGIN_K

Выберите M.* FROM (
Выберите AutheriseID, идентификатор пользователя, имя, AccountNumber, Имя_учетной_записи, матч, частота
От авторизировать
Где частота=1
) M внутреннее соединение разрешает A на M. UID=A.UID и имя М.=имя А.
И А. AutheriseID&ЛТ;&ГТ;М. AutheriseID и А. uid В (выбрать первые 1 номер uid авторизацию от заказа жидкости )