SQL clause to find certain pairs in a select [closed] - sql

Closed. This question needs details or clarity. It is not currently accepting answers.
Want to improve this question? Add details and clarify the problem by editing this post.
Closed 6 years ago.
Improve this question
So I've run a SELECT which gave me this result so far:
These two columns are from different tables I've joined together. Both are stored as Numbers. In this case "ID" is the main entity and ID_1 describes a state that "ID" can be in. A main entity can have multiple states at once and multiple entities can be in the same state at the same time.
Right now, my select shows ALL entity-state-pairs on my DB. My goal for the final result is to show the rows for any entity that does not have at least one entry with their state set to 1 or 9. In the above example, I would like the final results to show the rows with the following IDs: 62 and 82
Any idea on how to archive this?
Thanks in advance!

You can use an outer join to accomplish this by doing something akin to
SELECT DISTINCT t1.ID
FROM TABLE_1 ti
LEFT OUTER JOIN (SELECT t2.ID
FROM TABLE_2 t2
WHERE t2.ID_1 IN (1, 9))
WHERE t2.ID IS NULL;

This will get the ID's from the second table where ID_1 is 1 or 9:
SELECT ID
FROM second_table
WHERE ID_1 IN (1, 9)
Using that, you can select from the first table where the ID isn't in the result set above:
SELECT DISTINCT ID
FROM first_table
WHERE ID NOT IN (
SELECT ID
FROM second_table
WHERE ID_1 IN (1, 9)
);
If you have a scenario where, for example, ID 63 has three records in the second table with ID_1 values of 3, 4 and 6, the SELECT DISTINCT will make sure ID 63 only shows once in the results instead of three times.
Addendum
Also see the answer from Bob Jarvis. The query is more involved but returns the same results. More importantly, it will run a lot faster for larger datasets.

Related

Comparing two tables without foreign key [closed]

Closed. This question needs details or clarity. It is not currently accepting answers.
Want to improve this question? Add details and clarify the problem by editing this post.
Closed 1 year ago.
Improve this question
There are two tables in 2 different databases one table consists of Salutations example Mr, Miss and other table has names with Salutation example Mr.XYZ, Miss.ABC so I need a query which will compare the two tables and gives only those names from table 1 which are of matching salutations.
Example :
Table 1 Table 2
Salutation column Name column
Mr., Mr.Abc
Miss., Mr.XYZ
Mr. & Mrs. Mr. & Mrs. Def
Jr. xyz
So the query needs to compare two tables and give the output as
Mr.Abc,
Mr.Xyz
Mr. & Mrs. Def
I think you want join query with like:
select t2.*, t1.salutation
from table2 t2 join
table1 t1
on t2.name like concat(t1.saluation, '%');
The one caveat is that this can return more than one match. For instance, anything that matches "Mr. & Mrs." would also match "Mr.". To fix this, you can choose the longest match, using apply:
select t2.*, t1.salutation
from table2 t2 cross apply
(select top (1) t1.*
from table1 t1
where t2.name like concat(t1.saluation, '%')
order by len(t1.saluation) desc
) t1;
try this:
SELECT T2.*, T1.Salutation
FROM MyDatabase2.Myschema2.Table2 as T2
INNER JOIN MyDatabase1.Myschema1.Table1 as T1
ON T2.Name LIKE '%'+T1.Salutation+'%'

sql generate group on related groups [closed]

Closed. This question needs details or clarity. It is not currently accepting answers.
Want to improve this question? Add details and clarify the problem by editing this post.
Closed 4 years ago.
Improve this question
Sorry, if question unclear, i had misstakes it first tables. I made some updates:
Database: PostgreSQL
I want to group table based on transition (if a=b & b=c then a=c)
Adding a pair (4,c) will merge 2 groups to one "group1".
i assume u want a.b.c to be group1 and the d as group2..
the groupby will work perfectly fine with aliases..
but the number of group op wants is 3 millions groups so a stored proc with a incremental in the end and group by will work fine..
From your comments, it looks like you want to find out transitive relationship.
You can do that with following query. But if the goal here is just to identify the relationship among different groups with their respective id, i guess you can afford to have groups which are not getting incremented with 1.
According to your given example in OP, i think it won't affect you if end result has group1 and group5 instead of group2.
If mention result is fine then you can do that with following updated query. Giving group names in successive manner will impact on query performance which you don't want as you've 3 million of groups.
Please try following query:
select t1.id, concat('group', min(t2.minId)) groups
from t1
join
(select min(id) minId, groups
from t1
group by groups
) t2
on t1.groups = t2.groups
join (select #cnt := 1)y
group by t1.id;
Demo : Click here

Remove null values in SQL server [closed]

Closed. This question needs to be more focused. It is not currently accepting answers.
Want to improve this question? Update the question so it focuses on one problem only by editing this post.
Closed 5 years ago.
Improve this question
Hello, Does anuone knows how can I remowe the null values corresponding to the description of the same product key? So, I have one product Key and its description in each language.
I'm trying to use the coalesce function, but it doesnt return me anything.
It looks like you want to combine the rows together for each ProductKey.
So instead of 5 lines, each with a single column populated, you want one line, with all 5 columns populated.
Do it like this:
Select Distinct T.ProductKey, C1.Column1, C2.Column2, C3.Column3 from MyTable T
left join MyTable C1 on C1.ProductKey = T.ProductKey and C1.Column1 is not null
left join MyTable C2 on C2.ProductKey = T.ProductKey and C2.Column2 is not null
left join MyTable C3 on C3.ProductKey = T.ProductKey and C3.Column3 is not null
Just replace "MyTable" above with your table name, and "Column1, Column2, Column3" with the names of the columns your data is in.
Pretend that each column is on its own separate table, and you need to use joins to connect all the tables back to your master set of ProductKeys.
Think about it in sets:
Basically you are going to make one master list of the keys that is distinct/unique (step 1), and then do a new left join for each column you want to attach to the master list (step 2), and as part of the joins, tell it to get the non-NULL values and ignore the NULLs.
you can use GROUP BY as below.
SELECT ProductKey,
MAX(C_ar_description) AS C_ar_description,
MAX(C_en_description) AS C_en_description,
MAX(C_fr_description) AS C_fr_description
FROM YourTable
GROUP BY ProductKey
You should use the results to fix the data so you dont need to do this every time.

how to do a distinct with select all [closed]

Closed. This question needs details or clarity. It is not currently accepting answers.
Want to improve this question? Add details and clarify the problem by editing this post.
Closed 8 years ago.
Improve this question
I am trying to select all fields and get a distinct in 1 field where a certain condition is true but I am getting an error saying incorrect syntax this is what I have
var sql = #"SELECT * distinct threadID from Threadposts where profileID = 1";
I am new to mssql but can not figure out what is wrong with the query above, I simply want all fields included where profileID= 1 and select distinct values from threadID
You need to be clearer about what you want. You are querying a tabled called Threadposts for records where the profileID is 1. This will return multiple rows with different values I expect.
Are you wanting to count how many posts were made by that person? Are you wanting a list of threads by that person?
-- count of rows
SELECT COUNT(*)
FROM Threadposts
WHERE profileID = 1
-- list of threads
SELECT *
FROM Threadposts
WHERE profileID = 1
If you are wanting something different then you'll need to update your question.
PS: the DISTINCT keyword will look at the data returned and give distinct values only, e.g. if you wanted distinct topics posted by this user regardless of if they created multiple threads with the same name:
SELECT DISTINCT ThreadTopic
FROM Threadposts
WHERE profileID = 1
Using DISTINCT * almost never makes sense, since each row will have a unique ID (hopefully) so will already be distinct.
DISTINCT is essentially short-hand for GROUP BY on all selected columns when you don't need any aggregates. What you are asking for is a query where you are grouping on a single column, but not aggregating the remaining columns. That doesn't make sense.
In a table, a column may contain many duplicate values; and sometimes you only want to list the different (distinct) values. The DISTINCT keyword can be used to return only distinct (different) values.
You want to select all the columns but distinct only with a particular one (threadID)
Try using:
var sql = #"SELECT DISTINCT ON threadID * FROM Threadposts WHERE profileID = 1;

Left join multiple tables onto one table [closed]

Closed. This question needs to be more focused. It is not currently accepting answers.
Want to improve this question? Update the question so it focuses on one problem only by editing this post.
Closed 9 years ago.
The community reviewed whether to reopen this question 9 months ago and left it closed:
Original close reason(s) were not resolved
Improve this question
I want to left join multiple tables to one table. The tables are themselves results of subqueries.
A classical example that comes to my mind is, I have a bunch of subqueries:
1. Subquery A gives me details of students - say table 1
2. Subquery B gives me student scores in Math - say table 2
3. Subquery C gives me student scores in English - say table 3
The tables contain scores only if the student has taken that test and the student is to be considered failed if he/she has not taken test at all (or has a score < passing score). I have student IDs (unique per person) in each table to join on.
What do I want from these? I am trying to build a dynamic query (where some parts are populated at runtime by an external mechanism) by performing some joins on these tables to give me:
1. Students who passed in both tests and corresponding scores
2. Students passed in either test, but failed (or did not take) the other test and the corresponding scores (NULL if not taken).
3. All students and their corresponding scores.
What I have on mind is left joining each score table to student profile table. How should I go about this?
Before you go ahead and suggest table 1 left join table 2 left join table 3, this structure will cause problems if, say table 2 contains a null record for a particular student (as per my knowledge). And this basically joins table 3 on table 2 and not on table 1, from my understanding, which is what I want.
PS: Feel free to suggest better ways to get what I need, if you know any.
You can create the appropriate relations by writing carefully your query:
select
t1.*, t2.foo, t3.bar
from
table1 as t1
left join table2 as t2 on t1.id = t2.id
left join table3 as t3 on t1.id = t3.id
As you can see, table3 is related to table1 (not to table2), which is what you want.