【问题标题】:Not getting SQL query for UNION to return correct value没有让 UNION 的 SQL 查询返回正确的值
【发布时间】:2014-09-08 17:41:20
【问题描述】:

带有 UNION 查询的问题,我需要从一个表中获取“术语”的记录数,其中我指定了“ID”和“计数”字段。

注意如果分级机怀疑使用了 UNION ALL,则分级机正在降级。

我正在尝试几种不同的格式……但没有一个能正常工作。

------(版本 1)------

例如

    select count(term) from frequency where (select docid =
    '10398_txt_earn' where count = '1' UNION select docid =
    '925_txt_trade' where count = '1');

给我“0”。评分员告诉我“0”不正确。

如果我分成两部分,我会得到每个部分的值(110 和 225)。

------(版本 2)------

我修改了查询,使用这里的格式:

http://sqlite.1065341.n5.nabble.com/UNION-QUERY-td42629.html

所以我现在有查询(顺便说一句......与海报所暗示的不同,我必须使用 UNION......除非我可以使用 UNION ALL 然后选择唯一记录......但这似乎是不必要的计算步骤)

   select count(term) from (select * from frequency where
   (docid='10398_txt_earn' and count='1'))
   UNION
   select term from (select * from frequency where 
   (docid='925_txt_trade' and count='1'));

给我两行输出:第 1 行:110,第 2 行:225

如果我将 'select count(term)' 替换为 'select term'...我会得到一个列表,其长度是上述两个值的总和

--------(版本 3)--------

  select (term) from frequency where (select docid = '10398_txt_earn' 
  where count = '1')
  UNION
  select (term) from frequency where (select docid = '925_txt_trade' 
  where count = '1');

再次,给我两行输出:第 1 行:110,第 2 行:225

问题??? 您将如何修改它以便获得一个包含 UNIQUE 共享术语计数的值?

【问题讨论】:

  • count 是一个保留字。我很惊讶你可以在 where 子句中使用它而不在 [] 中转义它。此外,是否所有“条款”都具有非空值?如果不是,您的计数会有所不同,因为计数不会计算空字段。但是,如果您使用count(*),它将计算所有行,而不考虑空值。最后,您的第二个查询似乎应该返回您在假设 count 是文本字段、docID 是文本字段并且 term 永远不会为空之后的内容。
  • 'count' 有两个角色。第一个实例,如“count(term)”是查询的一部分......第二个实例,如“count = '1'”是因为数据库中的一个字段称为“count”
  • [count] = '1' 括在括号中 RDBMS 可能会混淆计数函数与计数字段。第二个 tablename.term 有空值吗?如果是这样计算空值不起作用。
  • @xQbert COUNT 不是list of keywords in Sqlite 的元素。
  • 不...我不认为计数是导致问题的原因...它没有导致以前的问题出现问题。工会的说法是错误的。我需要知道如何纠正它。

标签: sql sqlite count union


【解决方案1】:

知道了……这行得通:

from (
select term
from frequency
where docid in ("10398_txt_earn") AND count = '1'
UNION
select term
from frequency
where docid in ("925_txt_trade") AND count = '1');

【讨论】:

    【解决方案2】:

    您正在寻找两个项目的计数(where 子句)并且需要它也是 where "count" ='1'?这对我来说听起来很直接 - 一个 where 子句。

    SELECT SUM(TermCounts)
    FROM (
        SELECT COUNT(DISTINCT terms) AS TermCounts
        FROM frequency
        WHERE docid = '10398_txt_earn'
            AND "count" = '1'
        UNION ALL
        SELECT COUNT(DISTINCT terms) AS TermCounts
        FROM frequency
        WHERE docid = '925_txt_trade'
    ) CountUnion;
    

    【讨论】:

    • 作业是将其翻译成查询: πterm(σdocid=10398_txt_earn and count=1(frequency)) U πterm(σdocid=925_txt_trade and count=1(frequency))
    • 但是你想要 1 行吗?
    • 我想要满足所有要求的唯一术语的计数。
    • SQL 基于集合计算,但其结果通常基于对结果的具体要求。您使用的集合表示法可能表示两行,每行包含不同术语的计数。上面的查询更能说明 πterm((σdocid=10398_txt_earn or σdocid=925_txt_trade) and count=1(frequency))。我刚刚进行的编辑计算了不同的术语,因此重复项不会超过一次。这样的翻译很难。您是在寻找一个数字,还是基于标准的有序集合?
    • 你说这很有趣......唯一产生了评分者正在寻找的答案(单个数字)是:从 docid in ("925_txt_trade ", "10398_txt_earn") 和 count = '1';但是,这不使用联合......整个问题是关于在 SQL 查询中使用联合。
    【解决方案3】:

    我会用这个

    select count(term) from frequency where docid in ('10398_txt_earn' '925_txt_trade') AND count = '1';
    

    但是如果你需要使用 UNION

    select sum(termCount) from (
    select count(term) termCount from (select * from frequency where
    docid='10398_txt_earn' and count='1' group by term)
     UNION
    select count(term) from (select * from frequency where 
    docid='925_txt_trade' and count='1' group by term)
    );
    

    【讨论】:

    • 我猜对于 UNION,它应该省略“术语”字段中的重复项...b/c 这是两个部分的总和...并且评分者告诉我使用“联合”而不是“联合所有”
    • 没错,distinct 也会这样做。计数(不同的术语)
    • 我添加了“distinct”来生成“select sum (distinct termCount)”,但我仍然得到错误的答案。
    • 当它到达 select sum() 时,distinct 必须在内部选择中,所有内容都已计算在内。
    • 我回的号码是一样的。
    猜你喜欢
    • 2021-07-28
    • 1970-01-01
    • 1970-01-01
    • 2017-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-23
    相关资源
    最近更新 更多