【发布时间】:2023-04-01 04:44:02
【问题描述】:
我想合并一些行,以便正确过滤客户。
SELECT
StammIndex
, sPropSet
, bProp01
FROM [Properties] as properties
RIGHT JOIN [Kunden] as kunden
ON Kunden.StammIndex = properties.KundenIndex
“StammIndex”是客户 ID,
“sPropSet”是属性和
"bProp01" 告诉您该属性是选中 (1) 还是未选中 (0)
问题是,至少检查过一次属性的客户被保存在数据库中。 这意味着,客户 ID 将被保存多次。
现在我想获取所有没有检查“Serienbrief”属性的客户。
SELECT
StammIndex
, sPropSet
, bProp01
FROM [Properties] as properties
RIGHT JOIN [Kunden] as kunden
ON Kunden.StammIndex = properties.KundenIndex
WHERE NOT (sPropSet = 'Serienbrief' AND bProp01 = 1) OR sPropSet IS NULL
在这里您可以看到客户“10001”仍然存在,因为他有两个属性。我也希望删除客户“10001”,因为他还检查了“Serienbrief”属性。
stackoverflow 上的第一篇文章,如果我没有正确解释我的问题,非常抱歉。 如果您还有其他问题,请随时提出。
编辑*
我的过滤器在 C# 中。后面的代码是这样的
internal class FilterEigenschaften
{
public static List<UndBlock> FilterEigenschaftenListe = new List<UndBlock>();
public List<AdressenListe> Filter(Connection conn)
{
Criteria undBlockCriteria = conn.CreateCriteria();
foreach (UndBlock undBlock in FilterEigenschaften.FilterEigenschaftenListe)
{
Criteria oderBlockCriteria = conn.CreateCriteria();
foreach (OderBlock oderBlock in undBlock.OderBlock)
{
Criteria filterBlockCriteria = conn.CreateCriteria();
foreach (FilterBlock filterBlock in oderBlock.FilterBlock.Where(y => !string.IsNullOrEmpty(y.Wert)))
{
filterBlockCriteria.AddAnd("sPropSet", Operator.Equal, filterBlock.Kriterium);
filterBlockCriteria.AddAnd("bProp" + this.FiterSqlEigenschaftenFelder(conn, filterBlock), Operator.Equal, 1);
if (filterBlock.Operand == "Ist markiert")
{
}
else
{
}
}
oderBlockCriteria.AddOr(filterBlockCriteria);
}
undBlockCriteria.AddAnd(oderBlockCriteria);
}
string cmdText = $"SELECT Distinct(Kunde.StammIndex) " +
$"FROM {conn.Tablenames[4]} AS Kunde " +
$"RIGHT JOIN {conn.Tablenames[12]} AS Properties " +
$"ON Kunde.StammIndex = Properties.KundenIndex " +
$"WHERE {undBlockCriteria}";
return WordSqlAdressen.GetAdressenListe(conn, cmdText);
}
private string FiterSqlEigenschaftenFelder(Connection conn, FilterBlock filterBlock)
{
for (int i = 1; i < 31; i++)
{
using (Command cmd = conn.CreateCommand($"SELECT sProp{i:00} " +
$"FROM {conn.Tablenames[13]} " +
$"WHERE sPropSet = '{filterBlock.Kriterium}'"))
{
using (DataReader dr = cmd.ExecuteReaderEx())
{
while (dr.Read())
{
if (dr.GetString((0)) == filterBlock.Wert)
{
return i.ToString("00");
}
}
}
}
}
return null;
}
}
我只能用一条SQL语句来查看,属性是勾选还是不勾选
【问题讨论】:
-
(1) 将您的查询作为 text 而不是图像。 (2) 标记您正在使用的数据库。 (3) 您显示来自一个“表”的示例数据,但您的查询引用了多个表。我很困惑。
-
现在好点了吗?
-
[Kunden] 的架构是什么?
-
[Kunden] 数据库中包含所有客户及其数据
标签: c# sql sql-server database filter