开发者社区> 问答> 正文

SQL合并行以能够进行过滤

我想合并一些行,以便可以正确过滤客户。


 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语句来查看该属性是否已选中

展开
收起
Puppet 2020-01-03 11:37:42 445 0
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;

    2020-01-03 11:37:59
    赞同 展开评论 打赏
问答分类:
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
SQL Server在电子商务中的应用与实践 立即下载
GeoMesa on Spark SQL 立即下载
原生SQL on Hadoop引擎- Apache HAWQ 2.x最新技术解密malili 立即下载