Самый простой способ, это просто расширить логики и включают в себя оба случая:
SELECT id, user_name, color1, color2, fruit1, fruit2
FROM myTable
WHERE (color1 <> color2 AND fruit1 = fruit2)
OR (color1 = color2 AND fruit1 <> fruit2)
От ваш комментарий, вы должны попробовать что-то немного более сложное:
SELECT nonmatching.id, user_name, prop_name, value1, value2
FROM
(
SELECT id, user_name, prop_name, value1, value2
FROM
(
SELECT id, user_name, 'color' AS prop_name,
color1 AS value1, color2 AS value2
FROM myTable
UNION ALL
SELECT id, user_name, 'fruit' AS prop_name,
fruit1 AS value1, fruit2 AS value2
FROM myTable
) propertyExpanded
WHERE value1 <> value2
) nonmatching
Если вы хотите только вернуть строки с одним несоответствием, например, вы можете добавить следующее:
INNER JOIN
(
SELECT id, COUNT(1) AS mismatchCount = 1
FROM
(
SELECT id, user_name, 'color' AS prop_name,
color1 AS value1, color2 AS value2
FROM myTable
UNION ALL
SELECT id, user_name, 'fruit' AS prop_name,
fruit1 AS value1, fruit2 AS value2
FROM myTable
) propertyExpanded
WHERE value1 <> value2
GROUP BY id
) nonmatchingCount ON nonmatching.id = nonmatchingCount.id
WHERE nonmatchingCount.mismatchCount = 1
У меня есть много столбцов для сравнения, я не могу включить все случаи. BTW этот метод также возвращает соответствующие таблицы. Я хочу только вернуть набор данных с 'id' и не сопоставлять таблицы. – kajab
@kajab Посмотрите мое редактирование и посмотрите, насколько оно ближе к тому, что вы пытаетесь получить –