Что такое стандартный SQL-запрос для получения пересечения таблиц?

Выбор союза:

select * from table1 
union 
select * from table1_backup 

Какой запрос выбрать перекресток?

Пересечение по каждому полю или только по ключу?

Ben Hoffstein 29.09.2008 18:08

Вы используете SQL Server 2005 или другую СУБД?

Ben Hoffstein 29.09.2008 18:13

Попытка быть совместимой с кросс-db. Основное внимание уделяется MySQL и SQLServer.

Peter Turner 29.09.2008 18:17
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
6
3
26 439
9

Ответы 9

В SQL Server пересекаться

select * from table1 
intersect
select * from table1_backup

Блин, это просто ответ SQL Server, нет ли кросс-db запроса SQL Server / MySQL?

Peter Turner 29.09.2008 18:10

Согласно сообщениям в блогах и спискам рассылки 2005 года, которые я обнаружил в Google, MySQL не поддерживает прямую нотацию пересечения, а вместо этого предлагает внутренние соединения или подзапросы.

Tom Ritter 29.09.2008 18:13

В вопросе не говорится, что требуется решение MySQL. Имейте в виду, что интерес также является неявным DISTINCT (таким же, как UNION и MINUS).

David Aldridge 29.09.2008 19:38

внутреннее соединение я думаю: предположим, что T1 и T2 имеют одинаковую структуру:

выберите T1. * из Внутреннее соединение T1 T2 на T1.pkField = T2.pkField

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

Peter Turner 29.09.2008 18:12

«Пересечение» также является частью стандартного SQL.

Внутреннее соединение дает другой ответ.

Итак, какой будет запрос? select * from table1 пересекается select * from table2 дает мне ошибку в mysql

Peter Turner 29.09.2008 18:13

select distinct * from (select * from table1 union select * from table1_backup) 

Отлично, это тот запрос, который я искал, stackoverflow потрясающий, занял всего 5 минут и был намного интереснее, чем Google. Этот ответ идеально подходит для меня во всех смыслах, за исключением того, что в конце нужно указать "as table_x", чтобы не было нарушения ключа в моей версии SQL.

Peter Turner 29.09.2008 18:16

Это не возвращает пересечение ... оно возвращает каждую строку в каждой из таблиц и отфильтровывает дубликаты.

Tom Ritter 29.09.2008 18:26

SELECT *
FROM table1
WHERE EXISTS
(SELECT *
FROM table1_backup
WHERE table1.pk = table1_backup.pk)

работает

Это похоже на хороший ответ, но не такой абстрактный, как тот, который я принял. Наверное, тоже быстрее.

Peter Turner 29.09.2008 18:21

Для моих целей предложение where мне не понадобилось.

Peter Turner 29.09.2008 18:31

Вам нужно предложение WHERE, иначе это не имеет смысла. Вы просто вернете все строки из table1, если какие-либо строки существуют в table1_backup. В противном случае вы получите ноль строк.

beach 07.08.2009 03:49

По поводу подобных вопросов я обычно возвращаюсь к этому визуальному ресурсу:

Визуальное объяснение SQL-соединений

вот решение для mySQL:

CREATE TABLE table1(
id INT(10),
fk_id INT(10),
PRIMARY KEY (id, fk_id),
FOREIGN KEY table1(id) REFERENCES another_table(id),
FOREIGN KEY table1(fk_id) REFERENCES other_table(id)
);

SELECT table1.* FROM table1 as t0
INNER JOIN table1 as a ON (t0.id = a.id and fk_id=1)
INNER JOIN table1 as b ON (t0.id = b.id and fk_id=2)
INNER JOIN table1 as c ON (t0.id = c.id and fk_id=3)
ORDER BY table1.id;

В основном у вас есть таблица математических подмножеств (например, 1 = {1, 2, 3}, 2 = {3, 4, 2}, ..., n = {1, 4, 7}) с идентификатором атрибута, который является номером набора, и fk_ id, который ссылается на ПЕРВИЧНЫЙ КЛЮЧ таблицы элементов, надмножество (имеется в виду возможные значения для чисел в фигурных скобках). Для тех, кто не склонен к математике, давайте представим, что у вас есть таблица other_ table, которая представляет собой список элементов, и еще одна таблица, another_ table, которая представляет собой список номеров транзакций, и обе таблицы образуют таблицу от многих до -многие отношения, таким образом создавая «table1». теперь давайте представим, что вы хотите знать идентификаторы в «другой_таблице», в которой были элементы 1, 2 и 3. Это и есть запрос для этого.

подзапросы ?! В самом деле?

чтобы получить пересечение table1 и table2:

SELECT * FROM table1, table2 WHERE table1.pk=table2.pk;

Это не пересечение, это просто соединение. Союзы работают с двумя идентичными наборами данных, искал похожую функцию. Но вы правы, вы можете присоединиться к каждому из них. -1 - это просто напрасное использование имени Господа.

Peter Turner 29.12.2009 17:54

Пересечение двух одинаковых таблиц a и b может быть выполнено следующим образом:

SELECT a.id, a.name
FROM a INNER JOIN b
USING (id, name)

Другие вопросы по теме