如何从sqlite表中选择记录以获得两个特定的表?

sczxawaw  于 2023-05-18  发布在  SQLite
关注(0)|答案(1)|浏览(193)

我有一个SQLite表,其中一些列只有两个行单元格可以同时包含相同的值,例如列ColA(ValA 1)和ColC(ValC 1)中的单元格
| ID| ColA| ColB| ColC| ColD|
| --------------|--------------|--------------|--------------|--------------|
| 1|ValA1| ValB1|**ValC1| ValD1|
| 二|ValA2| ValB2| ValC2| ValD2|
| 三|ValA1| ValB3|**ValC1| ValD3|
| 四|ValA4| ValB4| ValC4| ValD4|
| 五|ValA1| ValB5|**ValC1| ValD5|
| 六|ValA1| ValB6|**ValC1| ValD6|
| 七|ValA7| ValB7| ValC7| ValD7|
我需要返回两个表的SELECT查询
1.具有同时在ColA(ValA 1)和ColC(ValC 1)中没有相同值的记录(除了第一个记录,在本例中ID = 1),并且没有“ID”列
| ID| ColA| ColB| ColC| ColD|
| --------------|--------------|--------------|--------------|--------------|
| 1|ValA1| ValB1|**ValC1| ValD1|
| 二|ValA2| ValB2| ValC2| ValD2|
| 四|ValA4| ValB4| ValC4| ValD4|
| 七|ValA7| ValB7| ValC7| ValD7|
1.在此示例中,具有同时在ColA(ValA 1)和ColC(ValC 1)中包含相同值的记录,并且没有“ID”列和ID = 1的行,因为此行在第一个表中
| ID| ColA| ColB| ColC| ColD|
| --------------|--------------|--------------|--------------|--------------|
| 三|ValA1| ValB3|**ValC1| ValD3|
| 五|ValA1| ValB5|**ValC1| ValD5|
| 六|ValA1| ValB6|**ValC1| ValD6|
我尝试对第一种情况使用“SELECT”查询

  1. SELECT ColA,ColB,ColC,ColD FROM table t1 WHERE EXISTS(SELECT ColA,ColC FROM table t2 WHERE t1.ColA = t2.ColA AND t1.ColC = t2.ColC GROUP BY ColA HAVING(count(ColA)=1 AND count(ColC)=1))
    并获得了不包含ID = 1的行的表
    | ID| ColA| ColB| ColC| ColD|
    | --------------|--------------|--------------|--------------|--------------|
    | 二|ValA2| ValB2| ValC2| ValD2|
    | 四|ValA4| ValB4| ValC4| ValD4|
    | 七|ValA7| ValB7| ValC7| ValD7|
    和'SELECT'查询用于第二种情况
  2. SELECT ColA,ColB,ColC,ColD FROM table t1 WHERE EXISTS(SELECT ColA,ColC FROM table t2 WHERE t1.ColA = t2.ColA AND t1.ColC = t2.ColC GROUP BY ColA HAVING(count(ColA)>1 AND count(ColC)>1))
    并获取了行ID = 1的表
    | ID| ColA| ColB| ColC| ColD|
    | --------------|--------------|--------------|--------------|--------------|
    | 1|ValA1| ValB1|**ValC1| ValD1|
    | 三|ValA1| ValB3|**ValC1| ValD3|
    | 五|ValA1| ValB5|**ValC1| ValD5|
    | 六|ValA1| ValB6|**ValC1| ValD6|
    谢谢你的回复
1u4esq0p

1u4esq0p1#

我们可以使用row_number函数。对于第一种情况,* 同时记录ColA(ValA1)和ColC(ValC1)中没有相同值的记录,除了第一个记录,在本示例中ID = 1 *:

with t as
(
  select *, 
    row_number() over (partition by ColA, ColC order by ID) rn
from tbl_name
) 
select ID, ColA, ColB, ColC, ColD
from t
where rn = 1
order by ID

对于第二种情况,* 同时在ColA(ValA1)和ColC(ValC1)中包含相同值且没有“ID”列和ID = 1的行的记录 *:

with t as
(
  select *, 
    row_number() over (partition by ColA, ColC order by ID) rn
from tbl_name
) 
select ID, ColA, ColB, ColC, ColD
from t
where rn > 1
order by ID

Demo

相关问题