выберите 2 столбца из 2 таблиц, используя соединение - PullRequest
0 голосов
/ 30 апреля 2018

У меня есть 2 таблицы, в Table1 есть столбец с именами книг и многие другие столбцы, в то время как в таблице 2 есть только 2 столбца - все названия книг и нет страниц. Количество названий книг, используемых в Таблице 1, меньше, чем в таблице 2. Столбец идентификатора отсутствует, поэтому его необходимо объединить по названию книги. Все книги, указанные в Таблице 2, не используются в Таблице 1, они имеют меньший поднабор. я пытаюсь выберите имя table1.book, table2.noOfPages из табл.1 внутреннее соединение по названию книги

Хотя в таблице 1 и только 100000 строк в таблице 2 и 7000 строк, запрос возвращает 200000 строк! Я ожидаю, что результат будет соответствовать количеству строк в табл.1 Не уверен, что я делаю не так? Может кто-нибудь помочь, пожалуйста? Спасибо Suzy

Ответы [ 4 ]

0 голосов
/ 30 апреля 2018
select t1.bookname, t2.noOfPages
from table1 t1 left join
     table2 t2
     on t1.bookname = t2.bookname
-- and t1.bookname like '%martin%' -- do not filter here
where t1.bookname like '%martin%'; -- filter conditions ALWAYS in where

Никогда не фильтруйте ваши данные в join -условии. Это очень медленно. Добавьте фильтры в where -part. Таким образом, ваши данные сокращаются до того, как БД соединит таблицы.

0 голосов
/ 30 апреля 2018

Один из способов - MAX с GROUP BY, чтобы вернуть ожидаемый результат без повторяющихся значений, но он может вернуть неправильное количество страниц из-за MAX в запросе, поэтому, если все в порядке, оставьте его, в противном случае найдите дубликаты и исправить это

SELECT t1.bookname, t2.noOfPages
FROM (SELECT bookname, MAX(noOfPages) AS noOfPages 
      FROM table2
      GROUP BY bookname) t2  
INNER JOIN  table1 t1 ON t1.bookname = t2.bookname;
0 голосов
/ 30 апреля 2018
Use an INNER JOIN to get the pairs only. ie. The union of A and B, where A is table1, and B is table2.

example. 

SELECT t1.BookName, t2.noOfPages 
FROM Table1 as t1 INNER JOIN Table2 as t2 on t1.BookName = t2.BookName

Возможно, отсутствующим элементом является ссылка на ключ, или, возможно, в любой таблице есть повторяющиеся имена, это будет трудно определить, так как нет первичного ключа и внешнего ключа. Может быть, попробуйте использовать DISTINCT:

SELECT DISTINCT t1.BookName, t2.noOfPages 
FROM Table1 as t1 INNER JOIN Table2 as t2 on t1.BookName = t2.BookName
0 голосов
/ 30 апреля 2018

Вы хотите left join, что-то вроде:

select t1.bookname, t2.noOfPages
from table1 t1 left join
     table2 t2
     on t1.bookname = t2.bookname;

Вы можете получить больше результатов, чем в table1, если в table2 есть дубликаты. Вы можете найти их, выполнив:

select t2.bookname
from table2 t2
group by t2.bookname
having count(*) > 1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...