dbTalk Databases Forums  

multi column sub select equivalent for sql server 2005

comp.databases.ms-sqlserver comp.databases.ms-sqlserver


Discuss multi column sub select equivalent for sql server 2005 in the comp.databases.ms-sqlserver forum.



Reply
 
Thread Tools Display Modes
  #1  
Old   
Jeff Kish
 
Posts: n/a

Default multi column sub select equivalent for sql server 2005 - 12-03-2007 , 10:15 PM






Can anyone tell me how to do this in sql server?
I am currently doing this query in oracle:

select table1.col1,table1.col2,table2.col3,table4.col4
where table1.col1 = table2.col3 and
table2.col3 = table4.col5 and
(table1.col1,table1.col2) not in
select table2.col4,table2.col5 from table2


it is the where two column values from any row are not found in any
row in table2 part that I can't figure out.



thanks
Jeff

Reply With Quote
  #2  
Old   
Erland Sommarskog
 
Posts: n/a

Default Re: multi column sub select equivalent for sql server 2005 - 12-04-2007 , 03:25 AM






Jeff Kish (kishjjrjj (AT) charter (DOT) net) writes:
Quote:
Can anyone tell me how to do this in sql server?
I am currently doing this query in oracle:

select table1.col1,table1.col2,table2.col3,table4.col4
where table1.col1 = table2.col3 and
table2.col3 = table4.col5 and
(table1.col1,table1.col2) not in
select table2.col4,table2.col5 from table2


it is the where two column values from any row are not found in any
row in table2 part that I can't figure out.
Row constructors is part of the ANSI Stanard, but not implemented in
SQL Server. So it's only to chalk one up for Oracle there.

Fortunately, in this situation you could just as well use NOT EXISTS:

select ...
from table1 t1
where not exists (select *
from table2 t2
where t1.col1 = t2.col1
and t1.col2 = t2.col2)



--
Erland Sommarskog, SQL Server MVP, esquel (AT) sommarskog (DOT) se

Books Online for SQL Server 2005 at
http://www.microsoft.com/technet/pro...ads/books.mspx
Books Online for SQL Server 2000 at
http://www.microsoft.com/sql/prodinf...ons/books.mspx


Reply With Quote
  #3  
Old   
FunBoy
 
Posts: n/a

Default Re: multi column sub select equivalent for sql server 2005 - 12-04-2007 , 03:36 AM



On Dec 4, 9:15 am, Jeff Kish <kishjj... (AT) charter (DOT) net> wrote:
Quote:
Can anyone tell me how to do this in sql server?
I am currently doing this query in oracle:

select table1.col1,table1.col2,table2.col3,table4.col4
where table1.col1 = table2.col3 and
table2.col3 = table4.col5 and
(table1.col1,table1.col2) not in
select table2.col4,table2.col5 from table2

it is the where two column values from any row are not found in any
row in table2 part that I can't figure out.

thanks
Jeff

It can be done slightly different way,


select table1.col1,table1.col2,table2.col3,table4.col4
where table1.col1 = table2.col3 and
table2.col3 = table4.col5 and
cast(table1 as varchar(20)) +'-'+cast(col1 as varchar(20)) not in(
select cast(table2.col4 as varchar(20)) + '-' + cast(table2.col5 as
varchar(20)) from table2)

Regards
Monojit


Reply With Quote
  #4  
Old   
Jeff Kish
 
Posts: n/a

Default Re: multi column sub select equivalent for sql server 2005 - 12-04-2007 , 06:31 AM



On Tue, 4 Dec 2007 09:25:48 +0000 (UTC), Erland Sommarskog
<esquel (AT) sommarskog (DOT) se> wrote:

Quote:
Jeff Kish (kishjjrjj (AT) charter (DOT) net) writes:
Can anyone tell me how to do this in sql server?
I am currently doing this query in oracle:

select table1.col1,table1.col2,table2.col3,table4.col4
where table1.col1 = table2.col3 and
table2.col3 = table4.col5 and
(table1.col1,table1.col2) not in
select table2.col4,table2.col5 from table2


it is the where two column values from any row are not found in any
row in table2 part that I can't figure out.

Row constructors is part of the ANSI Stanard, but not implemented in
SQL Server. So it's only to chalk one up for Oracle there.

Fortunately, in this situation you could just as well use NOT EXISTS:

select ...
from table1 t1
where not exists (select *
from table2 t2
where t1.col1 = t2.col1
and t1.col2 = t2.col2)
thanks much. I'll test things out.
Jeff


Reply With Quote
  #5  
Old   
Jeff Kish
 
Posts: n/a

Default Re: multi column sub select equivalent for sql server 2005 - 12-04-2007 , 06:32 AM



On Tue, 4 Dec 2007 01:36:01 -0800 (PST), FunBoy
<monojitaich (AT) gmail (DOT) com> wrote:

Quote:
On Dec 4, 9:15 am, Jeff Kish <kishjj... (AT) charter (DOT) net> wrote:
Can anyone tell me how to do this in sql server?
I am currently doing this query in oracle:

select table1.col1,table1.col2,table2.col3,table4.col4
where table1.col1 = table2.col3 and
table2.col3 = table4.col5 and
(table1.col1,table1.col2) not in
select table2.col4,table2.col5 from table2

it is the where two column values from any row are not found in any
row in table2 part that I can't figure out.

thanks
Jeff


It can be done slightly different way,


select table1.col1,table1.col2,table2.col3,table4.col4
where table1.col1 = table2.col3 and
table2.col3 = table4.col5 and
cast(table1 as varchar(20)) +'-'+cast(col1 as varchar(20)) not in(
select cast(table2.col4 as varchar(20)) + '-' + cast(table2.col5 as
varchar(20)) from table2)

Regards
Monojit
thanks. I take it this '-' stops the data from accidentally
matching?
Jeff


Reply With Quote
  #6  
Old   
Tom van Stiphout
 
Posts: n/a

Default Re: multi column sub select equivalent for sql server 2005 - 12-04-2007 , 07:56 AM



On Tue, 04 Dec 2007 07:32:33 -0500, Jeff Kish <kishjjrjj (AT) charter (DOT) net>
wrote:

It creates a single column with concatenated data. You could use any
concatenator (if that's a word) e.g. verticalbar or tilde that is not
used in the actual data.

-Tom.




Quote:
On Tue, 4 Dec 2007 01:36:01 -0800 (PST), FunBoy
monojitaich (AT) gmail (DOT) com> wrote:

On Dec 4, 9:15 am, Jeff Kish <kishjj... (AT) charter (DOT) net> wrote:
Can anyone tell me how to do this in sql server?
I am currently doing this query in oracle:

select table1.col1,table1.col2,table2.col3,table4.col4
where table1.col1 = table2.col3 and
table2.col3 = table4.col5 and
(table1.col1,table1.col2) not in
select table2.col4,table2.col5 from table2

it is the where two column values from any row are not found in any
row in table2 part that I can't figure out.

thanks
Jeff


It can be done slightly different way,


select table1.col1,table1.col2,table2.col3,table4.col4
where table1.col1 = table2.col3 and
table2.col3 = table4.col5 and
cast(table1 as varchar(20)) +'-'+cast(col1 as varchar(20)) not in(
select cast(table2.col4 as varchar(20)) + '-' + cast(table2.col5 as
varchar(20)) from table2)

Regards
Monojit
thanks. I take it this '-' stops the data from accidentally
matching?
Jeff

Reply With Quote
  #7  
Old   
kishjeff
 
Posts: n/a

Default Re: multi column sub select equivalent for sql server 2005 - 12-04-2007 , 09:16 AM



On Dec 4, 8:56 am, Tom van Stiphout <no.spam.tom7... (AT) cox (DOT) net> wrote:
Quote:
On Tue, 04 Dec 2007 07:32:33 -0500, Jeff Kish <kishjj... (AT) charter (DOT) net
wrote:

It creates a single column with concatenated data. You could use any
concatenator (if that's a word) e.g. verticalbar or tilde that is not
used in the actual data.

-Tom.



On Tue, 4 Dec 2007 01:36:01 -0800 (PST), FunBoy
monojita... (AT) gmail (DOT) com> wrote:

On Dec 4, 9:15 am, Jeff Kish <kishjj... (AT) charter (DOT) net> wrote:
Can anyone tell me how to do this in sql server?
I am currently doing this query in oracle:

select table1.col1,table1.col2,table2.col3,table4.col4
where table1.col1 = table2.col3 and
table2.col3 = table4.col5 and
(table1.col1,table1.col2) not in
select table2.col4,table2.col5 from table2

it is the where two column values from any row are not found in any
row in table2 part that I can't figure out.

thanks
Jeff

It can be done slightly different way,

select table1.col1,table1.col2,table2.col3,table4.col4
where table1.col1 = table2.col3 and
table2.col3 = table4.col5 and
cast(table1 as varchar(20)) +'-'+cast(col1 as varchar(20)) not in(
select cast(table2.col4 as varchar(20)) + '-' + cast(table2.col5 as
varchar(20)) from table2)

Regards
Monojit
thanks. I take it this '-' stops the data from accidentally
matching?
Jeff- Hide quoted text -

- Show quoted text -
I guess that is the 'key', i.e. the character has to be absolutely not
in the data or it has the potential (small but real) to fail, right?

thanks
Jeff


Reply With Quote
  #8  
Old   
Hugo Kornelis
 
Posts: n/a

Default Re: multi column sub select equivalent for sql server 2005 - 12-04-2007 , 02:39 PM



On Tue, 4 Dec 2007 01:36:01 -0800 (PST), FunBoy wrote:

Quote:
On Dec 4, 9:15 am, Jeff Kish <kishjj... (AT) charter (DOT) net> wrote:
Can anyone tell me how to do this in sql server?
I am currently doing this query in oracle:

select table1.col1,table1.col2,table2.col3,table4.col4
where table1.col1 = table2.col3 and
table2.col3 = table4.col5 and
(table1.col1,table1.col2) not in
select table2.col4,table2.col5 from table2

it is the where two column values from any row are not found in any
row in table2 part that I can't figure out.

thanks
Jeff


It can be done slightly different way,


select table1.col1,table1.col2,table2.col3,table4.col4
where table1.col1 = table2.col3 and
table2.col3 = table4.col5 and
cast(table1 as varchar(20)) +'-'+cast(col1 as varchar(20)) not in(
select cast(table2.col4 as varchar(20)) + '-' + cast(table2.col5 as
varchar(20)) from table2)
Hi Monojit,

While that may work (provided the '-' character doesn't occur in the
regular data), it will not perform quite as well as the NOT EXISTS
versions posted by Erland. If there are any indexes on the columns,
embedding them in an expression will make it impossible for the DBMS to
use that index for efficient seeking of matching rows.

--
Hugo Kornelis, SQL Server MVP
My SQL Server blog: http://sqlblog.com/blogs/hugo_kornelis


Reply With Quote
  #9  
Old   
Erland Sommarskog
 
Posts: n/a

Default Re: multi column sub select equivalent for sql server 2005 - 12-04-2007 , 04:29 PM



kishjeff (kishjjrjj (AT) charter (DOT) net) writes:
Quote:
I guess that is the 'key', i.e. the character has to be absolutely not
in the data or it has the potential (small but real) to fail, right?
The key is that it is a completely unnecessary kludge, when there exists
a perfectly normal solution with NOT EXISTS.

Not that this kludge also prevents efficient use of indexes.

There are cases when concatenating stuff can be a useful trick, but this
is not one of them.


--
Erland Sommarskog, SQL Server MVP, esquel (AT) sommarskog (DOT) se

Books Online for SQL Server 2005 at
http://www.microsoft.com/technet/pro...ads/books.mspx
Books Online for SQL Server 2000 at
http://www.microsoft.com/sql/prodinf...ons/books.mspx


Reply With Quote
  #10  
Old   
Tom van Stiphout
 
Posts: n/a

Default Re: multi column sub select equivalent for sql server 2005 - 12-04-2007 , 08:33 PM



On Tue, 4 Dec 2007 22:29:35 +0000 (UTC), Erland Sommarskog
<esquel (AT) sommarskog (DOT) se> wrote:

I absolutely agree. I was just answering the question.
-Tom.


Quote:
kishjeff (kishjjrjj (AT) charter (DOT) net) writes:
I guess that is the 'key', i.e. the character has to be absolutely not
in the data or it has the potential (small but real) to fail, right?

The key is that it is a completely unnecessary kludge, when there exists
a perfectly normal solution with NOT EXISTS.

Not that this kludge also prevents efficient use of indexes.

There are cases when concatenating stuff can be a useful trick, but this
is not one of them.

Reply With Quote
Reply




Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is On
HTML code is Off



Powered by vBulletin Version 3.5.3
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.