【问题标题】:select 2 columns from 2 tables using a join使用连接从 2 个表中选择 2 列
【发布时间】:2018-10-10 11:09:12
【问题描述】:
我有 2 个表,Table1 有一个名为 book names 的列和许多其他列,而 table 2 只有 2 个列 - 所有的书名和页数。
表 1 中使用的书名数量小于表 2。没有 id 列,因此必须按书名加入。
表2中命名的所有书籍都没有在表1中使用,它有一个较小的子集。
我在尝试着
选择 table1.book 名称,table2.noOfPages
来自表.1
书名的内连接
虽然表1只有100000行,表2只有7000行,但查询返回200000行!我希望结果与 table.1 中的行数匹配
不知道我做错了什么?
有人可以帮忙吗?
谢谢
苏西
【问题讨论】:
标签:
sql
sql-server
sql-server-2008
【解决方案1】:
你想要一个left join,比如:
select t1.bookname, t2.noOfPages
from table1 t1 left join
table2 t2
on t1.bookname = t2.bookname;
如果table2 中存在重复项,您可能会得到比table1 中更多 的结果。您可以通过以下方式找到这些:
select t2.bookname
from table2 t2
group by t2.bookname
having count(*) > 1;
【解决方案2】:
一种方法是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;
【解决方案3】:
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
【解决方案4】:
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 中添加过滤器。这样,在 db 连接表之前,您的数据就会减少。