【问题标题】:sql3 query, can't understand what I'm doing wrongsql3查询,不明白我做错了什么
【发布时间】:2013-05-11 07:23:31
【问题描述】:

我有一个数据库,其中一个表有 3 列。这是 .schema 给出的: .schema

CREATE TABLE Frequency (
docid VARCHAR(255),
term VARCHAR(255),
count int,
PRIMARY KEY(docid, term));

我正在尝试一个连接查询来获取两个特定的 docid 并按术语匹配它们,(对不起,如果它没有意义,我是 sql 新手)。我期待一个格式如下的表格:

docid1 |term |count
docid2 |term |count

但我得到的结果格式为docid1 |term |count|docid2 |term |count 我究竟做错了什么?

还尝试选择 docid 或任何其他列而不是执行 select* 会给我一个模棱两可的键错误。这是我正在使用的查询:

 select* from (select docid, term, count from frequency where docid = '10080_txt_crude') as c join (select docid , term, count from frequency where docid = '17035_txt_earn') as d on c.term = d.term;

最后添加 group by docid 只能给出一个答案。

【问题讨论】:

    标签: sql


    【解决方案1】:

    尝试select c.* from ... 选择一个表中的所有列,而不是所有连接表中的所有列。

    select c.* from 
        (select docid, term, count from frequency where docid = '10080_txt_crude') as c 
    join 
        (select docid , term, count from frequency where docid = '17035_txt_earn') as d 
    on c.term = d.term;
    

    或者,也许您可​​以进一步简化语法?

    select c.docid,c.term,c.ount 
    from frequency c
    join frequency d on c.term = d.term
    where c.docid = '10080_txt_crude' and
        d.docid = '17035_txt_earn';
    

    问题是,你实际上在哪里使用 D。

    你要不要select * from frequency where docid='10080_txt_crude' or docid='17035_txt_earn'


    在两个 DocID 之间加入匹配的术语:

    select c.docid as c_docid, d.docid as d_docid, c.term, c.count, d.count
    from frequency c
    join frequency d on c.term = d.term
    where c.docid = '10080_txt_crude' and
        d.docid = '17035_txt_earn';
    

    这将产生 (C DocID, D DocID, Term (在 C 和 D 中相等), C Count, D Count)。

    【讨论】:

    • 我正在尝试使用这两个 id 获取 docid,然后列出术语匹配的那些。例如,执行您的代码会给我包含 docid 1 的结果,但我想要的是在满足上述条件的下方列出来自 docid 2 的 docid。是否有意义?不知道我解释清楚没有。
    • 如果你想要并排的结果,那就是 SELECT c.*, d.* 和一个 JOIN。如果你想要一个高于另一个的结果,那就是 UNION。使用 JOIN 更容易找到匹配项——SQL 表达式可以跨连接引用列,但不能在行之间引用。在 SQL 查询和其他操作中,行在数学上是独立的。
    • 那么带连接的 selct* 只能并排产生结果?这是一个硬件作业,当我找到正确答案时,我会及时通知你。我可能错过了什么。
    【解决方案2】:
    SELECT docid,term,count
    FROM Frequency
    WHERE docid=docid1 or docid=docid2
    GROUP BY docid,term,count
    HAVING COUNT(*) >1 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-06
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-26
      • 1970-01-01
      相关资源
      最近更新 更多