【问题标题】:PROC SQL select all of 2 tables and specifics in anotherPROC SQL 在另一个中选择所有 2 个表和细节
【发布时间】:2015-06-05 19:23:34
【问题描述】:

我有这样的代码

 PROC SQL;
 CREATE TABLE my_table as
 SELECT DISTINCT(
   t1.*,
   t2.*,
   t3.value3 )
 FROM table1 as t1
 INNER JOIN table2 as t2
     ON  t1.value = t2.value
 INNER JOIN t3.value as t3
    ON  t1.value2 = t3.value2
 ;
  quit; 

但 SAS 将 t1.* 视为一种格式。我该怎么办?有没有办法在不先建立 2 个单独的表的情况下表达这一点?

【问题讨论】:

  • 我认为您不需要括号。你得到什么错误?
  • 代码中的“ON t2.value = t2.value”是错误的。它是“ON t1.value = t2.value”。
  • 这是括号。我更改为 distinct (t1*) 、 Distinct(t2) 等,现在它似乎可以工作了。谢谢(对不起,我的意思是 t1=t2 值我将表名更改为 post。
  • DISTINCT 应该只出现一次。 SELECT DISTINCT T1.*, t2.*, t3.value3 from ... 是正确的。把它放在多个地方没有帮助。
  • 不确定这是否是问题所在,但是“INNER JOIN t3.value as t3”是什么意思? 't3' 库中是否有库名称 't3' 和名为 'value' 的表?如果是这种情况,在您的查询中再次使用“t3”,但这次是指一个表?

标签: sql sas proc-sql


【解决方案1】:
Distinct 

不需要括号,它适用于

下列出的所有项目
Select 

建议你考虑使用

Coalesce   

Coalescec ( for character) 

因为重复的变量在 t1 和 t2 都存在。 Cartisan 产品会返回一些不可取的重复属性。

另一种方法是将sql语句分开,这样会很清楚

 Proc sql;
 Select distinct * from table1 as L1
 Inner join
 Select distinct * from table 2 as L2 
 On L1.value =L2.value
 Inner join
 ...

【讨论】:

    【解决方案2】:

    您的代码可能还有其他问题。

    通过使用 t1.* 和 t2.*,您最终会得到两个名为 value 的变量,SAS 不会容忍这些变量。

    恐怕您可以在 SAS 中使用的最佳语法是:

    PROC SQL;
         CREATE TABLE my_table as
         SELECT DISTINCT(
           t1.*,
           t2.value2,
           t3.value3 )
         FROM table1 as t1
         INNER JOIN table2 as t2
             ON  t1.value = t2.value
         INNER JOIN t3.value as t3
            ON  t1.value2 = t3.value2
         ;
     QUIT; 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-13
      • 2019-05-04
      • 2012-10-15
      • 1970-01-01
      • 2015-10-15
      • 1970-01-01
      • 2021-01-26
      • 1970-01-01
      相关资源
      最近更新 更多