У меня есть два оператора select, каждый из которых имеет одну строку, но фиксированное количество столбцов (15).
До сих пор я пытался использовать intersect
, но, похоже, это не то, что я хочу.
select 'ABC' as test, 'DEF' as test2, '123' as test3
select 'ABC2' as test, 'DEF' as test2, '124' as test3
Сравнение обоих отобразит строку, в которой будут различия
Результатом будут столбцы с разными значениями в виде строки. В этом случае:
"'test': 'ABC', 'test3': '123'"
Я предположил, что вы используете здесь SQL Server на основе тега [tsql ] и, таким образом, пометили [ sql-server ]. Если вы не используете SQL Server и используете другой продукт, использующий T-SQL, например Azure SQL Edge, Azure Synapse, Sybase и т. д., отредактируйте свой пост, чтобы исправить теги.
Нет неизвестного количества столбцов, а есть фиксированное число, но оба столбца всегда будут иметь одинаковое количество столбцов.
Так что именно вы здесь спрашиваете? Каковы ваши ожидаемые результаты двух вышеуказанных запросов?
Он отобразит один столбец с именем test и значение ABC. это все разные значения
Пожалуйста, отредактируйте вопрос и включите ожидаемое.
Пожалуйста, объясните логику, почему отображается только первое значение? И если вам нужно только первое значение, просто выберите первое значение и удалите второй выбор.
Я пытаюсь сравнить оба оператора select, чтобы получить разные значения. потому что «ABC» != «ABC2» в тесте столбца это отобразится. но 'DEF' - это то же значение в test2
SELECT 'ABC' AS test EXCEPT SELECT 'ABC2' AS test;
?
Однако, как уже было сказано, вы должны возвращать статическое количество столбцов, поэтому, если вы хотите сравнить 2 столбца, вы всегда должны возвращать 2 столбца.
Но мне нужно проверить и test2. выберите «ABC» в качестве теста, «DEF» в качестве теста2, ЗА ИСКЛЮЧЕНИЕМ выбора «ABC2» в качестве теста, «DEF» в качестве теста2 по-прежнему возвращает DEF
И ваш сценарий кажется немного упрощенным, есть ли только 2 строки? И вы всегда хотите значение из первой строки, если оно отличается от значения во второй строке?
Чтобы сравнить 2 столбца, вам нужно будет что-то вернуть для второго столбца, даже если он нулевой.
Будет около 10+ столбцов, которые нужно будет сравнить
Основываясь на приведенных выше комментариях, уточните свой вопрос, чтобы обрабатывать больше столбцов, которые отличаются друг от друга, и зная, что вы должны вернуть статическое количество столбцов. И уточните, что есть только 2 строки
Как уже было сказано, вы не можете вернуть переменное количество столбцов, если вы сравниваете 11 столбцов, вам нужно 11 столбцов в ваших результатах или один столбец со значениями, разделенными запятыми - может быть, это то, что вы имеете в виду?
хорошо, поскольку это не могут быть столбцы, я сделаю это строкой
Используйте набор выражений case, чтобы сравнить каждый столбец и вывести значение, если оно отличается, например.
select
case when a.test1 <> b.test1 then 'test1:' + a.test1 else '' end
+ case when a.test2 <> b.test2 then ', test2:' + a.test2 else '' end
+ case when a.test3 <> b.test3 then ', test3:' + a.test3 else '' end
from (
select 'ABC' as test1, 'DEF' as test2, '123' as test3
) a
cross join (
select 'ABC2' as test1, 'DEF' as test2, '124' as test3
) b;
Возвращает:
Это выполнить работу. Я нахожу это довольно медленным, с 15 случаями это занимает около 3-5 секунд.
Это зависит от индексов, которые у вас есть на вашем столе...
Оператор
SELECT
должен быть хорошо определен, поэтому он не может иметь неизвестное количество столбцов. В вашем примере они явно имеют 2 столбца и могут возвращать только 2 столбца.