【问题标题】: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 中的行数匹配 不知道我做错了什么? 有人可以帮忙吗? 谢谢 苏西

【问题讨论】:

  • 编辑您的问题并显示您正在使用的查询。
  • 表2有重复

标签: 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】:

一种方法是MAXGROUP 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 连接表之前,您的数据就会减少。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-15
        相关资源
        最近更新 更多