|
guys;
I trying to design a query that returns products ordered based on a self-reference foreign key (just like a linked list). I tried to make a recursive query (CTE), but i couldn't return the records as the table below.
product_id | next_id | product_name
5 | 3 | product 5
3 | 2 | product 3
2 | 4 | product 2
4 | 1 | product 4
1 | null | product 1
I am wondering if you can help me with this.
Help people,so poeple can help you.
|
|
|
|
|
finally, i designed a query that returns the desired results. its the following one.
create table products(product_id int, next_id int, product_name nvarchar(50));
insert into products(product_id, next_id, product_name)
Values (1, null, N'product1')
,(2, 4, N'product2')
,(3, 2, N'product3')
,(4, 1, N'product4')
,(5, 3, N'product5');
WITH LinkedList (product_id, next_id, product_name, Level)
AS
(
SELECT e.product_id, e.next_id, e.product_name,
0 AS Level
FROM products AS e
WHERE e.next_id IS NULL
UNION ALL
SELECT e.product_id, e.next_id, e.product_name,
Level + 1
FROM products AS e
INNER JOIN LinkedList AS d
ON e.next_id = d.product_id
)
SELECT product_id, next_id, product_name
FROM LinkedList
Order by Level desc;
drop Table products;
Help people,so poeple can help you.
|
|
|
|
|
Hello everyone,
I'm trying to understand this function.
Someone wrote this piece of code and I would like to use to do something simular.
On a daily basis we read .txt files into our SQL database through SSIS.
The data that's going through is growing fast and takes a long time to process. (for example a year of data is read every day into the db)
I want to make a dayset so that we only read one single day into the DB on top of the existing data and not the whole year.
Someone wrote this peace of code:
Select * , ROW_NUMBER() OVER (PARTITION BY PK_Assignment ORDER BY DATE, TIME) as LineNbr
from ProductivityColliDagSet
I was wondering what the Partition By statement means.
My guess was that you have to place the fields there that makes the record unique.
Can someone help me out with this because I read so many things on the internet and still I don't understand.
Also I don't have much experience with SQL, just the basics.
Ambertje
|
|
|
|
|
|
I've seen this already but still not clear to me sorry 
|
|
|
|
|
It determines the grouping. Play around with below script;
BEGIN TRANSACTION
CREATE TABLE SomeTest(
Field1 INTEGER,
Field2 CHAR(1),
Data VARCHAR(50))
INSERT INTO SomeTest VALUES (1, 'C', 'Test')
INSERT INTO SomeTest VALUES (1, 'A', 'Test')
INSERT INTO SomeTest VALUES (7, 'C', 'Test')
INSERT INTO SomeTest VALUES (7, 'A', 'Test')
INSERT INTO SomeTest VALUES (4, 'C', 'Test')
SELECT *
, ROW_NUMBER() OVER ( PARTITION BY Field2 ORDER BY Field1 )
FROM SomeTest
ROLLBACK
If you change the field that's being partitioned by to "Field1", you'll see a different grouping in the result-set (with each group receiving a unique numbering).
It's often used with a primary key because some idiot forgot to add an identity-field
Bastard Programmer from Hell
If you can't read my code, try converting it here[^]
|
|
|
|
|
Eddy Vluggen wrote: some idiot forgot to added an identity-field
FTFY
You'll never get very far if all you do is follow instructions.
|
|
|
|
|
I was more expecting at someone pointing out the option to count items based on particular groupings.
Sounds like you really dislike the identity-field?
Bastard Programmer from Hell
If you can't read my code, try converting it here[^]
|
|
|
|
|
Real databases use a sequence.
|
|
|
|
|
Begone with your Oracle concepts bah humbug!
Never underestimate the power of human stupidity
RAH
|
|
|
|
|
|
Eddy,
This example made it clear to me, I think I understand what it's doing.
Now I can try to rewrite the code to my needs.
Thank you for taking the time to help me
Ambertje
|
|
|
|
|
Ambertje wrote: I want to make a dayset so that we only read one single day into the DB on top of the existing data and not the whole year.
I don't see what that has to do with partitions - the database of course wouldn't have anything to do with reading files.
Ambertje wrote: and takes a long time to process.
Someone should optimize that process. I wouldn't be surprised if that means moving it out of SSIS but maybe it can be sped up as is.
Normally one profiles a process by actually timing the various parts and then using that data to determine where things can be made faster.
Although your description might suggest that every day you read the previous years data. If so one obvious optimization there would be to some producing a file that has a years worth of data. How one does that depends on the data.
|
|
|
|
|
The best way to understand this is to create a couple of tables and experiment.
It is quite difficult to explain what is going on in a partition statement - the closest I can get is transposing data in Excel.
However that does not explain how to go about transposing the data.
Think of it as changing column headings into row contents and row contents into column headings.
“That which can be asserted without evidence, can be dismissed without evidence.”
― Christopher Hitchens
|
|
|
|
|
Many thanks to everyone who is helping me, I really appreciate the effort you put into it to help newbe's.
Ambertje
|
|
|
|
|
Hi everyone,
I am creating a query to my database using SQL Server Management Studio
There is a data error in my image field of my row. I still can select another fields, but when I select content of the image field I get below error:
My query:
select diagram from Mytable where id = 5
Error 1:
A transport-level error has occurred when receiving results from the server. (provider: Shared Memory Provider, error: 0 - No process is on the other end of the pipe.)
When I tried to delete this row. I got another error (Error 2):
SQL Server detected a logical consistency-based I/O error: incorrect checksum (expected: 0x4da7af2c; actual: 0xda5e9af7). It occurred during a read of page (1:40403) in database ID 6 at offset 0x00000013ba6000 in file 'D:\CLCData\23_01_2013\CLC_LIS_Data.mdf'. Additional messages in the SQL Server error log or system event log may provide more detail. This is a severe error condition that threatens database integrity and must be corrected immediately. Complete a full database consistency check (DBCC CHECKDB). This error can be caused by many factors; for more information, see SQL Server Books Online.
When I select all data from the table, I got the error 1 at the above row position.
So, now I can't update or delete this row. Do you know this problem and how to fix it ?
Thank you very much,
Tai
|
|
|
|
|
Have you done what the error message suggested?
Never underestimate the power of human stupidity
RAH
|
|
|
|
|
Hi,
I checked the log error file. For the select query, I got the below error:
Error: 7886, Severity: 20, State: 1.
2014-07-14 11:27:01.50 spid52 A read operation on a large object failed while sending data to the client. A common cause for this is if the application is running in READ UNCOMMITTED isolation level. This connection will be terminated.
For the delete statement, I got the message:
Error: 824, Severity: 24, State: 2.
2014-07-14 13:34:10.12 spid51 SQL Server detected a logical consistency-based I/O error: incorrect checksum (expected: 0x4da7af2c; actual: 0xda5e9af7). It occurred during a read of page (1:40403) in database ID 6 at offset 0x00000013ba6000 in file 'D:\CLCData\23_01_2013\CLC_LIS_Data.mdf'. Additional messages in the SQL Server error log or system event log may provide more detail. This is a severe error condition that threatens database integrity and must be corrected immediately. Complete a full database consistency check (DBCC CHECKDB). This error can be caused by many factors; for more information, see SQL Server Books Online
But, I don't know how to fix it.
|
|
|
|
|
Execute DBCC CHECKDB int SQL Server Management Studio, just like the error message tells you, then see what the results of the check are.
Never underestimate the power of human stupidity
RAH
|
|
|
|
|
You have a damaged data file or the disk is damaged. You'll want to run the DBCC as the error suggests and see if you get additional details.
There are only 10 types of people in the world, those who understand binary and those who don't.
|
|
|
|
|
I quite don't understand why noone is using the WHERE-Syntax for table joining ...
I always see something like
SELECT O.Order_No, C.Address, F.Address
FROM Orders O
JOIN Address C
ON O.Customer = C.ID
JOIN Address F
ON O.Forwarder = C.ID
For me, the most irritating thig is the spreading of table names and aliases all over the Statement.
I prefer
SELECT O.Order_No, C.Address, F.Address
FROM Orders O, Address C, Address F
WHERE O.Customer = C.ID
AND O.Forwarder = F.ID
- It's shorter
- All table names and aliases are together
Arguments, anyone ?
|
|
|
|
|
Klaus-Werner Konrad wrote: Arguments,
Nope, I call them Oracle joins (I loathe Oracle) because that is the way I was taught in the 90s then I moved to SQL SErver and was introduced to the JOIN and have never used it since.
I will refactor any procedure I see using them and have a short, sharp discussion with the dev that uses it. Use join or quit.
Never underestimate the power of human stupidity
RAH
|
|
|
|
|
Mycroft Holmes wrote: Nope, I call them Oracle joins
Yeah - a really qualified Response ...
I ask for arguments, an your resposne is
Mycroft Holmes wrote: I will [...] have a short, sharp discussion with the dev that uses it
THIS is my Intention - to have a DISCUSSION about it !
But you have obvoiously no arguments, but prejudices against it - not the ideal base for discussions.
What would be your arguments in a discussion with your developer - do you even have any arguments ?
Note: I asked politely for arguments for - or against - my preferation, because (as every of us) I want to improve my abilities, and also to give some impressions to SQL newbies to decide what to do, and not to do.
So ...
HAVE VOU ARGUMENTS, or are you just felt to open your mouth ... ?
|
|
|
|
|
Klaus-Werner Konrad wrote: THIS is my Intention - to have a DISCUSSION about it !
So we are supposed to be telepathic so we can identify your INTENTIONS.
You stated that you prefer the JOIN format, then you asked for arguments to that position. Nowhere did you mention discussion.
I stated that I had no argument and qualified why. In other words I was supporting your preference!
I did not down vote your question or response (was not even aware you had been) as the question was valid and the response just means you are a bit pissy this morning.
Never underestimate the power of human stupidity
RAH
|
|
|
|
|
Well - the title should be clear enough, and I presented JOIN syntax and WHERE syntax,
expressing my worry about noone seems using WHERE.
THEN I asked for arguments - obviously (I thought so) WHY noone is using WHERE syntax,
and NOT to support my preference.
In other words: Are there any points (other than preference) to not using WHERE syntax ??
|
|
|
|
|