使用非重复计数时SQL SQLERE语句语法错误

Mat*_*att 3 sql sql-server-2008

我有一个WHERE逻辑上的条款,我想让它在短名称的第一个数字不匹配的情况下返回结果.

简称可以是:

1.1
1.2
2.1
2.2
Run Code Online (Sandbox Code Playgroud)

示例数据WITHOUT where子句:

+-----------+--------+------+
| Shortname | number |  ID  |
+-----------+--------+------+
| 2.1       |      1 | 3333 |
| 1.1       |     60 | 3333 |
| 1.2       |     90 | 3333 |
| 2.1       |     50 | 4444 |
| 2.2       |     30 | 4444 |
| 1.1       |     80 | 5555 |
| 1.2       |     10 | 5555 |
+-----------+--------+------+
Run Code Online (Sandbox Code Playgroud)

预期数据WITH where子句:

+-----------+--------+------+
| Shortname | number |  ID  |
+-----------+--------+------+
| 2.1       |      1 | 3333 |
| 1.1       |     60 | 3333 |
| 1.2       |     90 | 3333 |
+-----------+--------+------+
Run Code Online (Sandbox Code Playgroud)

我试过这段代码:

SELECT shortname, number, id
FROM table
WHERE ((left(shortname,1) like '%1%') != ((left(shortname,1) like '%2%')
Run Code Online (Sandbox Code Playgroud)

但它会产生错误:

消息102,级别15,状态1,行21
'''附近的语法不正确.

澄清更新

我需要每个ID的结果,所以在上面的示例中有ID 3333,4444和5555.我想只返回ID,3333因为它不是每个都只有一个第一个字符值shortname.它包含值12.

因为我不希望看到其他ID,因为短名称匹配在第一个数字1 = 1和2 = 2等.

Tar*_*ryn 10

如果要在其中返回ID多个第一个字符shortname,则首先查看获取行的不同计数:

select id
from yourtable
group by id
having count(distinct left(shortname, 1)) > 1;
Run Code Online (Sandbox Code Playgroud)

当与ID关联时,这应该返回具有2和1作为第一个字符的行.然后你可以用它来返回其余的数据:

;with cte as
(
  select id
  from yourtable
  group by id
  having count(distinct left(shortname, 1)) > 1
)
select 
  t.shortname,
  t.number, 
  t.id
from yourtable t
inner join cte c
  on t.id = c.id;
Run Code Online (Sandbox Code Playgroud)

请参阅SQL Fiddle with Demo.返回:

| SHORTNAME | NUMBER |   ID |
|-----------|--------|------|
|       2.1 |      1 | 3333 |
|       1.1 |     60 | 3333 |
|       1.2 |     90 | 3333 |
Run Code Online (Sandbox Code Playgroud)

更灵活的选项是获取小数点前的字符,并验证您是否具有所有数字的明确计数.要做到这一点,你会使用这样的函数CHARINDEX与一起LEFT.

;with cte as
(
  select id
  from yourtable
  group by id
  having count(distinct left(shortname, charindex('.', shortname)-1)) > 1
)
select 
  t.shortname,
  t.number, 
  t.id
from yourtable t
inner join cte c
  on t.id = c.id;
Run Code Online (Sandbox Code Playgroud)

请参阅SQL Fiddle with Demo.这将返回:

| SHORTNAME | NUMBER |   ID |
|-----------|--------|------|
|       2.1 |      1 | 3333 |
|       1.1 |     60 | 3333 |
|       1.2 |     90 | 3333 |
|      14.1 |      5 | 6666 |
|      14.2 |     78 | 6666 |
|      24.1 |     89 | 6666 |
Run Code Online (Sandbox Code Playgroud)