选择不同的行/有效的SQL语法?

时间:2014-06-20 14:20:11

标签: sql

这是一种有效的SQL语法:SELECT DISTINCT COLUMN,* FROM TABLE。

也就是说,是否有人知道几乎所有关系数据库系统是否都支持这种语法?

我想选择所有具有不同列值/外键的行,这些行引用另一个表的主键。

我想它一定要复杂一些,比如:

l_sbufSelectOldAppointments = new StringBuilder(256); l_sbufSelectOldAppointments.append("SELECT * FROM "); l_sbufSelectOldAppointments.append(l_rule.getOldTableName()); l_sbufSelectOldAppointments.append(" WHERE "); l_sbufSelectOldAppointments.append(l_rule.getOldRuleMasterFieldName()); l_sbufSelectOldAppointments.append(" IN "); l_sbufSelectOldAppointments.append("(SELECT DISTINCT "); l_sbufSelectOldAppointments.append(l_rule.getOldRuleMasterFieldName()); l_sbufSelectOldAppointments.append(" FROM "); l_sbufSelectOldAppointments.append(l_rule.getOldTableName()); l_sbufSelectOldAppointments.append(".A WHERE EXISTS (SELECT 1 FROM LCCALRECU B WHERE B.LID = A."); l_sbufSelectOldAppointments.append(l_rule.getOldRuleMasterFieldName()); l_sbufSelectOldAppointments.append("))");

使用Java StringBuilder构建查询。因此,我希望获得具有不同l_rule.getOldRuleMasterFieldName()值的所有行。

4 个答案:

答案 0 :(得分:1)

您的SQL查询中不需要DISTINCT关键字。在您提供的查询中,无论您是否放置了DISTINCT关键字,都应始终获得相同的结果。

这是您的SQL查询,我从您的代码中了解到:

SELECT * FROM OldTableName
 WHERE OldRuleMasterFieldName
 IN
( SELECT DISTINCT OldRuleMasterFieldName
  FROM OldTableName A
  WHERE EXISTS (SELECT 1 FROM LCCALRECU B WHERE B.LID = A.OldRuleMasterFieldName)
)

更通用,它适合这个模板:

SELECT ...
FROM sometable
WHERE justOneField 
  IN ( SELECT DISTINCT oneOtherField FROM ...)

如果你仔细想想,DISTINCT在这里什么都不做。如果重复删除用于填充IN()子句的记录,则无关紧要。成员资格过滤将是相同的。例如,当且仅当您居住IN ('France','France','France')时才会生活IN ('France')

只需取出DISTINCT

  IN ( SELECT oneOtherField FROM ...)

答案 1 :(得分:0)

是尝试此查询

SELECT "DISTINCT COLUMN" FROM TABLE

答案 2 :(得分:0)

否 - 语法在所有RDBMS

中无效

快速SqlFiddle表明SqlServerPostgres支持此功能,但不支持MySqlOracle

(SqlFiddle不允许对无效查询添加书签,但您只需切换RDBMS下拉并执行)

答案 3 :(得分:0)

例如,Oracle不支持它。你是说:给我所有的字段加上一列。但是那么“all”将全部加上列,而“all plus the column”因此意味着所有加上列加上列。等等。好吧,至少我猜这将是争论。但是,你可以做的是获取特定表的所有列以及任何其他列(可以来自同一个表):

select distinct mycol, mytable.* from mytable;
BTW:Distinct在这里毫无意义,但我猜你知道。编辑:对不起,我刚注意到我跳过了你请求的下半部分。所以你不知道。 Distinct为您提供不同的结果记录。一旦记录具有id,例如它们根据定义是不同的,并且distinct是多余的。考虑要比较哪些列的唯一性以及要显示的列。也许您正在寻找GROUP BY或EXISTS条款?