【问题标题】:SQL - have a result from one select into another selectSQL - 将一个选择的结果放入另一个选择
【发布时间】:2014-10-28 06:29:00
【问题描述】:

我有两个子查询,我想从中选择两个不同的列,但我不知道如何操作。试了很久。

换句话说,我需要这样做:

select distinct A, B 
from (select * from selectstatement 1, selectstatement 2);

我有的是这个。

我有两张表,table1 和 table2,每列都有 int 类型的三列。

我有:

selectstatement 1: 
      select * 
      from table1, table2;

selectstatement 2: 
      select distinct table1.A, table1.B, table2.A, table2.B 
      from table1, table2 
      where (table1.A > table1.B and table2.A > table2.B) 
         or (table1.B > table1.A and table2.B > table2.A);

我现在的问题是从这两个 select 语句中选择列 A 和 B,例如 select distinct A, B from (select * from selectstatement 1, selectstatement 2);

但我尝试过的一切都没有奏效。

这不起作用:

select distinct P.A, P.B, T.A, T.B 
from (    select distinct table1.A, table1.B, table2.A, table2.B 
          from table1, table2 
          where (table1.A > table1.B and table2.A > table2.B) 
             or (table1.B > table1.A and table2.B > table2.A)) as P, 
     (select * from table1, table2) as T;

但是如果我应该像“select distinct A, B from (select * from selectstatement 1, selectstatement 2);”那样做这也是错误的,不是吗?

【问题讨论】:

  • 查看表格别名
  • 查询 2 看起来不错。您选择有问题的四列。但是,您要在查询 1 中选择哪些列?还有 P.A、P.B、T.A、T.B?您正在那里进行交叉连接,因此您可以获得所有可用的组合。查询 2 中不能有任何组合不在查询 1 中。所以显然你想要不同的东西。但是什么?您说的是 两个 不同的列,但您选择的是 四个。建议:试着解释结果集应该是什么样的,就好像你对 SQL 一无所知。不要谈论连接和组合查询。只需描述结果表即可。
  • @ThorstenKettner:很好的建议。我会更进一步,不要描述结果表,而只是描述您正在寻找的结果。

标签: sql select relational-algebra


【解决方案1】:

试试这个代码。

     select t1.ks, t1.[# Tasks], coalesce(t2.[# Late], 0) as [# Late]
from 
    (SELECT ks, COUNT(*) AS '# Tasks' FROM Table GROUP BY ks) t1
left join
    (SELECT ks, COUNT(*) AS '# Late' FROM Table WHERE Age > Palt GROUP BY ks) t2
on
    t1.ks = t2.ks

【讨论】:

  • 我试过了,不行,这也是我上面的代码。
  • 我遇到了这个问题:消息 8156,级别 16,状态 1,第 5 行 为“P”多次指定了“A”列。消息 8156,级别 16,状态 1,第 6 行列“A”被多次指定为“T”。
  • 你应该为此使用 Union
  • 联合不起作用,因为我需要在两个不同的选择之间做一个 Cartesisk produkt。
  • 我已经编辑了我的答案,所以试试这个它会正常工作。
【解决方案2】:

反引号键位于大多数键盘的左上角。)

与代码块一样,代码跨度将以等宽字体显示。 Markdown 和 HTML 在其中不起作用。请注意,与代码块不同,代码跨度需要您手动转义其中的任何 HTML!

如果您的代码本身包含反引号,您可能必须使用多个反引号作为分隔符:

名称 Tuple`2 是有效的 .NET 类型名称。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-27
    相关资源
    最近更新 更多