473,396 Members | 1,853 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,396 software developers and data experts.

SQL query question #2

Hi All,

I have another SQL question, and this one is going to be difficult to
explain.

I have a table like this

rowid name changed
1 a 1
1 b 0
1 c 1
1 d 0
2 ....
2 ...
2 ....

I want to be able to find the next rowid in my table which matches my
criteria (my table has thousands, even hundreds of thousands of rows)

The criteria is the trouble you see. I have the notion when querying
against the name field of 'required' values and 'optional' values. So
for example if I said give me the first rowid which has a required
value 'a' and an optional value 'z' it would still give me the first
rowid (1) because z was an optional value.

But if I turned it around and said the required value was 'z' and
optional was 'a' it would not return rowid 1 because the first set of
rowids there do not have a value z.

That first requirement can be achieved with a query like this,

select * from table where rowid in
(select top (1) RowId from table where Name in ('required1',
'required2')
group by rowid having Count(Rowid) >= 2)
and Name in ('required1', 'required2','optional1','optional2')

So the inner query there forces the number of rows to be above 2 there
which would correspond to a match of 2 required values. The outer
query then returns back the rest of the rows with the matching rowid
including the required and optional values.

That works fine, but there is one more requirement which I have not
been able to handle. See the changed column there in the table above.
The next criteria is that at least one of the optional or required
values much have a value of 1 in the changed column. I came up with a
query to do this before, but it required another subquery which was
too slow.

Please help, even if you are not sure please help. I need to nail this
one.

Oct 29 '08 #1
3 1810
On Wed, 29 Oct 2008 15:33:07 -0700 (PDT), bob laughland wrote:
>Hi All,

I have another SQL question, and this one is going to be difficult to
explain.
(snip)

Hi Bob,

First - in the future, please post CREATE TABLE and INSERT statements,
as knowing the table structure makes it easier to understand the problem
and having test data makes it easier to test. And I don't have the time
to manually create a table or enter test data, so you (who needs the
question answered) are the one who should invest time to spoonfeed me
what I need to help you. :)

Second - based on your description, I fail to see where the optional
values weigh in. If a rowid has all the required values, then you want
to return it whether the optional values are or are not present. So I'd
say ditch the optional values and loook at the required values only.

Third - reread the reply by Joe Celko to your first question. He
describes two methods of relational division, one with nested subqueries
and another one with GROUP BY and HAVING. The extra requirement
introduced here is easy to implement if you use this second version, as
all it takes is one extra line in the HAVING clause:

AND SUM(CASE WHEN changed = 1 THEN 1 ELSE 0 END) >= 1

If changed is some numeric type, you could even simplify this to
AND SUM(changed) >= 1

--
Hugo Kornelis, SQL Server MVP
My SQL Server blog: http://sqlblog.com/blogs/hugo_kornelis
Oct 29 '08 #2
On Oct 30, 11:58*am, Hugo Kornelis
<h...@perFact.REMOVETHIS.info.INVALIDwrote:
On Wed, 29 Oct 2008 15:33:07 -0700 (PDT), bob laughland wrote:
Hi All,
I have another SQL question, and this one is going to be difficult to
explain.

(snip)

Hi Bob,

First - in the future, please post CREATE TABLE and INSERT statements,
as knowing the table structure makes it easier to understand the problem
and having test data makes it easier to test. And I don't have the time
to manually create a table or enter test data, so you (who needs the
question answered) are the one who should invest time to spoonfeed me
what I need to help you. :)

Second - based on your description, I fail to see where the optional
values weigh in. If a rowid has all the required values, then you want
to return it whether the optional values are or are not present. So I'd
say ditch the optional values and loook at the required values only.

Third - reread the reply by Joe Celko to your first question. He
describes two methods of relational division, one with nested subqueries
and another one with GROUP BY and HAVING. The extra requirement
introduced here is easy to implement if you use this second version, as
all it takes is one extra line in the HAVING clause:

*AND SUM(CASE WHEN changed = 1 THEN 1 ELSE 0 END) >= 1

If changed is some numeric type, you could even simplify this to
*AND SUM(changed) >= 1

--
Hugo Kornelis, SQL Server MVP
My SQL Server blog:http://sqlblog.com/blogs/hugo_kornelis
Thanks for that. Sorry to be a bit vague. I am under pressure to get
this problem solved. For the moment I am also looking into a totally
different solution.

But yeah - back to your response. The optional values do come into it,
but only because of the requirement to take note of the changed value.

E.g. if I query the above data with required values of 'b' and 'd'.
Neither 'b' or 'd' has a changed value of 1, so it should move onto
the next row (2) etc.

But what if I query on required values 'b' and 'd' and optional value
of 'c' then I want to return that row back as valid because the
optional value of 'c' does have a changed value of 1.

You also gave the idea of using this,

AND SUM(CASE WHEN changed = 1 THEN 1 ELSE 0 END) >= 1

I did have that the other day, but that changes the query from taking
4 seconds to run to a minute. It is very expensive doing it like that.

Thanks.
Oct 30 '08 #3
On Wed, 29 Oct 2008 21:29:09 -0700 (PDT), bob laughland wrote:
>But yeah - back to your response. The optional values do come into it,
but only because of the requirement to take note of the changed value.

E.g. if I query the above data with required values of 'b' and 'd'.
Neither 'b' or 'd' has a changed value of 1, so it should move onto
the next row (2) etc.

But what if I query on required values 'b' and 'd' and optional value
of 'c' then I want to return that row back as valid because the
optional value of 'c' does have a changed value of 1.

You also gave the idea of using this,

AND SUM(CASE WHEN changed = 1 THEN 1 ELSE 0 END) >= 1

I did have that the other day, but that changes the query from taking
4 seconds to run to a minute. It is very expensive doing it like that.
Hi Bob,

I think I can help you write your query. I might also be able to find
the root cause of the performance problem and a possible fix. But to do
that, I do need the information I already mentioned in my previous post:

* CREATE TABLE statements for all tables involved. Please include all
constraints, indexes, and properties - though you may omit columns that
are completely irrelevant to the problem.

* INSERT statements with some well-chosen rows of sample data. Make sure
that they work against the CREATE TABLE statements, and avoid using
non-portable date formats such as DD-MM-YYYY or MM-DD-YYYY.

* The results expected from the sample data chosen. Try to ensure that
all relevant cases should be included in the sample data, so that the
expected results are a good test case for the query functioning as
required.

--
Hugo Kornelis, SQL Server MVP
My SQL Server blog: http://sqlblog.com/blogs/hugo_kornelis
Oct 30 '08 #4

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

2
by: jaysonsch | last post by:
Hello! I am having some problems with a database query that I am trying to do. I am trying to develop a way to search a database for an entry and then edit the existing values. Upon submit, the...
29
by: shank | last post by:
1) I'm getting this error: Syntax error (missing operator) in query expression on the below statement. Can I get some advice. 2) I searched ASPFAQ and came up blank. Where can find the "rules"...
9
by: netpurpose | last post by:
I need to extract data from this table to find the lowest prices of each product as of today. The product will be listed/grouped by the name only, discarding the product code - I use...
3
by: Harvey | last post by:
Hi, I try to write an asp query form that lets client search any text-string and display all pages in my web server that contain the text. I have IIS 6.0 on a server 2003. The MSDN site says...
4
by: Diamondback | last post by:
I have two tables, WIDGETS and VERSIONS. The WIDGETS table has descriptive information about the widgets while the VERSIONS table contains IDs relating to different iterations of those widgets...
14
by: Dave Thomas | last post by:
If I have a table set up like this: Name | VARCHAR Email | VARCHAR Age | TINYINT | NULL (Default: NULL) And I want the user to enter his or her name, email, and age - but AGE is optional. ...
0
by: starace | last post by:
I have designed a form that has 5 different list boxes where the selections within each are used as criteria in building a dynamic query. Some boxes are set for multiple selections but these list...
6
by: jjturon | last post by:
Can anyone help me?? I am trying to pass a Select Query variable to a table using Dlookup and return the value to same select query but to another field. Ex. SalesManID ...
4
by: Stan | last post by:
I am using MS Office Access 2003 (11.5614). My basic question is can I run a query of a query datasheet. I want to use more that one criteria and can not get that query to work. I thought I...
6
by: jsacrey | last post by:
Hey everybody, got a secnario for ya that I need a bit of help with. Access 97 using linked tables from an SQL Server 2000 machine. I've created a simple query using two tables joined by one...
0
by: ryjfgjl | last post by:
In our work, we often receive Excel tables with data in the same format. If we want to analyze these data, it can be difficult to analyze them because the data is spread across multiple Excel files...
0
BarryA
by: BarryA | last post by:
What are the essential steps and strategies outlined in the Data Structures and Algorithms (DSA) roadmap for aspiring data scientists? How can individuals effectively utilize this roadmap to progress...
1
by: nemocccc | last post by:
hello, everyone, I want to develop a software for my android phone for daily needs, any suggestions?
1
by: Sonnysonu | last post by:
This is the data of csv file 1 2 3 1 2 3 1 2 3 1 2 3 2 3 2 3 3 the lengths should be different i have to store the data by column-wise with in the specific length. suppose the i have to...
0
by: Hystou | last post by:
There are some requirements for setting up RAID: 1. The motherboard and BIOS support RAID configuration. 2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...
0
marktang
by: marktang | last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However,...
0
Oralloy
by: Oralloy | last post by:
Hello folks, I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>". The problem is that using the GNU compilers,...
0
jinu1996
by: jinu1996 | last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven...
0
by: Hystou | last post by:
Overview: Windows 11 and 10 have less user interface control over operating system update behaviour than previous versions of Windows. In Windows 11 and 10, there is no way to turn off the Windows...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.