(сложно sql) сравнить две таблицы для разных значений - PullRequest
1 голос
/ 14 июля 2020

Я хочу сравнить значения table a & c и найти различия. Мы можем указать unique_key из table a путем сравнения id между table a & b, и сопоставив unique_key из table b & c, мы можем сравнить Name из table a & c.

Можем ли мы получить список строк, которые Name имеют другое значение для table a & c?

Итак, если я напишу таблицу,

table a 
+----+------+-----------+
| id | Name | int_value |
+----+------+-----------+
| a1 | aa   |         1 |
| a2 | bb   |         2 |
| a3 | cc   |         5 |
+----+------+-----------+
table b
+----+------+-----------+
| id | Name |unique_key |
+----+------+-----------+
| a1 | !!   |        u1 |
| a2 | @@   |        u2 |
| a3 | ##   |        u3 |
+----+------+-----------+
table c 
+----+------+-----------+
| id | Name |unique_key |
+----+------+-----------+
| c1 | aa   |        u1 |
| c2 | B1   |        u2 |
| c3 | C1   |        u3 |
+----+------+-----------+

В результате я хочу получить

NameA NameC unique_key
bb    B1    u2
cc    C1    u3
      

Я пробовал это sql, но ни один из них не дал мне правильного результата. Что бы вы сделали?

SELECT a.Name, c.Name, b.unique_key
FROM a
INNER JOIN b
ON a.id = b.id
LEFT JOIN c
ON b.unique_key = c.unique_key
and NOT EXISTS (SELECT * FROM a WHERE a.Name = b.Name);

реальный sql (для реальной БД) Я сделал

SELECT i.*, g.*, r.g_id
FROM i
INNER JOIN r
ON i.id = r.id
LEFT JOIN g
ON r.g_id = g.g_id
WHERE CAST('i.name1' as varbinary) != CAST('g.name1' as varbinary)
OR CAST('i.name2' as varbinary) != CAST('g.name2' as varbinary)
OR CAST('i.name3' as varbinary) != CAST('g.name3' as varbinary)
GROUP BY i.id
LIMIT 30;

ошибку я получил:

Error occurred.SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'varbinary) != CAST(

Ответы [ 2 ]

3 голосов
/ 14 июля 2020

Вы можете cast field как BINARY перед сравнением

по умолчанию aa и AA, оба одинаковые

SELECT i.*, g.*, r.g_id
FROM i
INNER JOIN r
ON i.id = r.id
LEFT JOIN g
ON r.g_id = g.g_id
WHERE CONVERT('i.name1' , BINARY) != CONVERT('g.name1' , BINARY)
OR CONVERT('i.name2' , BINARY) != CONVERT('g.name2' , BINARY)
OR CONVERT('i.name3', BINARY) != CONVERT('g.name3', BINARY)
GROUP BY i.id
LIMIT 30;
1 голос
/ 14 июля 2020

Кажется, вам просто нужны соединения и сравнение:

select a.name as nameA, c.name as nameC, b.unique_key
from a join
     b
     on a.id = b.id join
     c
     on b.unique_key = c.unique_key
where a.name <> c.name;

Я не понимаю, зачем нужно двоичное сравнение столбцов с именем name. Но вы можете использовать ключевое слово binary, если это действительно необходимо (оно не требуется для ваших демонстрационных данных).

Кроме того, ваш вопрос конкретно касается разных имен, а не недостающих строк. Так что внешние соединения тоже не подходят.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...