【问题标题】:SQL combine rows to be able to filterSQL 组合行以便能够过滤
【发布时间】: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


【解决方案1】:

您只需将条件移动到联接而不是 where 子句。

SELECT
  *
FROM Kuden k
LEFT JOIN Properties p
  ON k.StammIndex = p.KudenIndex
  AND p.sPropSet = 'Serienbrief'
  AND p.bProp01 = 1
WHERE p.KudenIndex IS NULL;

【讨论】:

  • 原因是因为将条件放在where中会导致左连接变为内连接。
  • Mhhh,使用 checked(1) 语句它可以工作,但使用 unchecked(0) 语句它不起作用。如果我现在将 1 更改为 0,它将获得所有 ID,除了 '10003'
  • 是的。查询返回“未检查 Serienbrief 属性的所有 Kuden”。这不是您要查找的信息吗?
  • 我有一个多重过滤器,这意味着用户可以要求检查属性“Serienbrief”和未检查属性“测试”,所以我只需要使用一个主要语句
  • 这与您存储数据的方式不兼容。正如您所指出的,您可能会为同一用户同时选中和取消选中某个属性的实例。与其用 SQL 解决这个问题,我认为你应该确保每个属性只能存在一次。
猜你喜欢
  • 2021-08-12
  • 2021-08-20
  • 1970-01-01
  • 2011-12-11
  • 1970-01-01
  • 2022-11-24
  • 2021-04-13
  • 2012-10-15
  • 1970-01-01
相关资源
最近更新 更多