MSSQL trigger: fill in rest of table based - sql

I have a table that looks like this:
Date
Col1
Col2
Col3 = Col1*Col2
03-03-2021
100
2
200
03-03-2020
200
1
200
04-20-2029
NULL
NULL
NULL
I want to create 2 triggers that do the following:
After u user inputs a new row, if col1 and col2 are null, search another table for the values of col1 and col2. If col1 is null, only search for col2. If col2 is null, only search for col1.
Upon update of col1, col2, recalculate col3.
Am having trouble getting started on this. Could someone point me in the right direction? Thanks

Related

Insert column from one table to another after copying

I am trying to run this query on SQL Server Management Studio. But I am getting an error. What I did initially was to copy a table from another table. the table from which I am copying is the painting table and I am trying to make a replica of that painting table, named as painting1. But the task was to copy all the columns except for 1.
painting
col1, col2, col3, col4
The query used for this task is as below
SELECT col1, col2, col3
INTO PAINTING1
FROM PAINTING
After the creation of painting1, it has col1, col2 and col3 from painting table
Now the task was to insert the one remaining column into the replica table, so what I did to insert that remaining column to insert the replica table painting1 from painting table.
INSERT INTO PAINTING1 (col4)
SELECT col4 FROM PAINTING
And I run into this error:
invalid column name 'col4'
Any suggestions on what I might be doing wrong,
First add the new column in the table PAINTING1:
ALTER TABLE PAINTING1 ADD col4 INTEGER;
Change INTEGER to the data type of col4 that you want.
What you actually need is to update PAINTING1 with the values of the column col4 from PAINTING.
This can only be done if one of the columns col1, col2 or col3 is unique, like a primary key, so it can be used as the link between the 2 tables:
UPDATE p1
SET p1.col4 = p.col4
FROM PAINTING1 p1 INNER JOIN PAINTING p
ON p.col1 = p1.col1
I used col1 as the link between the tables.
If col1 is not unique, use all 3 columns in the ON clause (if their combination is unique):
ON p.col1 = p1.col1 AND p.col2 = p1.col2 AND p.col3 = p1.col3
You're creating the table with col1, col2 and col3. How can it be anything but an error to refeference col4 that doesn't exist?
You can of course add additional columns to the table at any time, but what you could do is add col4 as part of your select into.
SELECT col1, col2, col3, '' as Col4 /* use / cast whatever data type it should be */
INTO PAINTING1
FROM PAINTING

sql query help, don't know how to term this

I'm not too sure how to term this question. Stay with me.
I want to create a query to retrieve the rows with x's in the row column in the table(this is a dummy table):
row col1 col2 col3
x 1 a c
x 2 b c
x 3 a c
4 b d
x 5 f g
So the way I want my query to work is to retrieve all rows where the value for col2 doesn't have a row in col3 where the value is d. Ie. value 'a' will be retrieved because it only has c's for col3, but value 'b' wont be retrieved because it has a d in col3 on the 4th row down.
I hope this is easy to understand.
Ps. Once I know how to do the query I expect I'll know how to phrase the title and will redo it. (although now I think about it, maybe this title is best for all those with questions like mine)
Based on everything you've provided, I'll have to make a few assumptions. Short of doing a self-join on the table, you could take advantage of an identity key on the table to use a simple query as such:
SELECT * FROM TABLE_NAME
WHERE id NOT IN (SELECT id FROM TABLE_NAME WHERE col3 = 'd');
If you don't have an identity key on the table, you could do something more like this:
SELECT * FROM TABLE_NAME
WHERE col2 NOT IN (SELECT col2 FROM TABLE_NAME WHERE col3 = 'd');
Both of these queries will return all tuples in the relation that have elements of col2 that are not in tuples where col3 contains 'd'.
Think of how you might do this manually, and put that into your query.
To get all the col3 values you'd write:
SELECT DISTINCT col3 FROM TABLE_NAME
Use that to filter rows from your selection via a not in clause:
SELECT
col1, col2, col3 FROM TABLE_NAME
WHERE col2 not in (SELECT DISTINCT col3 FROM TABLE_NAME);

Recursive select statement

I have the following table entries:
Col1 | Col2
------------------
3RDT | 3R9H
3R9H |
3R9J | 3RDT
3R9J | 3R9H
3HHA | 3ABC
3XXZ | 3HHA
I have a value 3R9J.
Now I want all records where Col1 has that value, in this case record 3 and 4.
Now I take the Col2 values of this records (3RDT and 3R9H) and consider those as my new Col1 values to get all records with the Col1 value 3RDT or 3R9H.
This should be done recursively. In addition it should also select all records in the other direction. If I start with 3RDT for Col1 I get the records where Col2 is 3RDT (3), then I have 3R9J for Col1 and get all records where I have 3R9J as Col1 value.
The expected output data in my example above should be the first 4 records.
If I understood your question correctly, that this query will do the job.
SQLFiddle
select *
from test
connect by col1 = prior col2
start with col1 = '3R9J'
union
select *
from test
connect by prior col1 = col2
start with col1 = '3RDT';
Please note that the union causes that each line is shown once.

SQL table search

I'm new to SQL and was just wondering how I would a value from a table only when it meets a certain condition.
I have a table that looks like the following (sorry for the rubbish formatting)
COL1 - COL2
1 - 3
1 - 2
2 - 2
3 - 3
3 - 4
I want to get values from COL1, but only if they don't have a specific value in COL2.
So for example if I didn't want the values where COL2 was 3, the only value that would be returned from COL1 would be 2.
Thanks for any help
To clarify, the two columns just store id's that reference other tables. I only want the values from COL1 that don't reference a specific values in COL2.
so when I saw I don't want the values where COL2 is equal to 3, this means the value '1' from COL1 won't be returned as on row 1 COL2 is 3 and 3 won't be returned from COL1 because on row4 COL2 is equal to 3
I think you look for something like this.
select COL1
from TABLE_FOO
where COL1 not in (
select COL1
from TABLE_FOO
where COL2 = 3
)
I think Specific value means the record having only one corresponding value in the col2.
2-2 is specific because it has a specific value.
select col1 from c group by col1 having count(col2) > 1
The above query gives all the col1 values which does not have a specific values.

SQL Inserting Data into table

I have a SQL table, let's call it "Table A", which has several rows of data. I then have a temp table called "Table b" that has one row of data. I want to be able to do a sql insert so that if Table A Column 1 is null, it will insert Table B Column 1's value.
So I'd wind up with something like this:
Table A
Col1 Col2 Col3
23 John Smith
23 Sam Jones
23 Jim Ham
Table B
Col1
23
Can someone explain how I might go about doing this? Any help will be appreciated.
You say insert, but I think you're asking for an update.
update TableA
set Col1 = (select Col1 from TableB)
where Col1 is null
update tableA set col1 = (select col1 from tableB)
where col1 is null